![老夫的正则表达式大成了,桀桀桀桀,,,[Python 正则表达式笔记] 老夫的正则表达式大成了,桀桀桀桀,,,[Python 正则表达式笔记]](/static/background/186.jpg)
一、正则表达式语法
(一) 字符与字符类
特殊字符
\.^$?+*{}[](| 为特殊字符,若想要使用字面值,必须使用 \ 进行转义
字符类 []
[] 匹配包含在方括号中的任何字符。它也可以指定范围,例:
-
[u4e00-u9fa5]匹配 Unicode 中文 -
[^\x00-\xff]匹配双字节字符(包括中文)
[a-zA-Z0-9]表示a到z,A到Z,0到9之间的任何一个字符
[] 中:
-
^放在第一个位置表示否定,放在其他位置表示字面值 -
\表示转义 -
-放在中间表示范围,放在其他位置表示字面值 - 其他特殊字符不再具备特殊意义,都表示字面值
- 字符类内部可以使用速记法,比如
\d \s \w
[^] 表示否定字符类,比如[^0-9]表示可以匹配一个任意非数字的字符
速记法
-
\d匹配一个 Unicode 数字,如果有 re.ASCII 标志,则匹配0-9 -
\D匹配 Unicode 非数字 -
\s匹配 Unicode 空白,如果带有 re.ASCII 标志,则匹配\t\n\r\f\v中的一个 -
\S匹配 Unicode 非空白 -
\w匹配 Unicode 单词字符,如果带有 re.ASCII 标志,则匹配[a-zA-Z0-9_]中的一个 -
\W匹配 Unicode 非单词字符
. 可以匹配除换行符之外的任何字符,如果有 re.DOTALL 标志,则匹配任意字符包括换行
(二)量词
-
*0次或多次 -
+1次或者多次 -
{m}m次 -
{m,}至少m次 -
{,n}最多n次 -
{m,n}至少m次,最多n次
? 0次或1次
? 切换为「最小匹配模式」
(三) 断言
-
\B匹配非单词边界,受ASCII标记影响 -
\A在起始处匹配 -
\Z在结尾处匹配 -
^在起始处匹配,如果有 MULTILINE 标志,则在每个换行符后匹配 -
$在结尾处匹配,如果有 MULTILINE 标志,则在每个换行符前匹配
\b匹配单词的边界,放在字符类 [] 中则表示 backspace
(四)捕获组
(的作用:
-
(?:可以关闭捕获,只用作分组 - 使用
|组合多个表达式,表示「或」 -
(?=...向前正项匹配,前方必须存在。 如\w(?=,匹配apple, banana中的apple -
(?!...向前负项匹配,前方必须没有 -
(?<=...向后正项匹配,后方必须存在 -
(?<!...向后负项匹配,后方必须没有
(是一个捕获组,可被 \N 引用,N 是序号,以左括号排位决定。\0 表示整个匹配的内容。
| 语言 | 命名捕获组 | 搜索中引用 | 替换中引用 |
|---|---|---|---|
| Python | (?P<name>... |
\N (?P=name |
\N \g<name> $N |
| JavaScript | (?<name>... |
\N \k<name> |
$N |
| .NET | (?<name>... (?'name'... |
\N \k<name> \k'name' |
$N ${N} ${name} |
| Perl | (?<name>... (?'name'... |
\N \gN \g{N} \g{name}(?N (?+N (?-N (?Name兼容 .Net Python 的语法 |
$N ${N} $+{Name} |
技巧:
- 在搜索中,若
- 在替换中,若
$12无法表示「第一个捕获组 + 数字2」,可以用$1\l2或者$1\u2表示
\12 无法表示「第一个捕获组 + 数字2」,可用 (?:\12 或者 \1[2] 表示
(五)条件匹配
- Perl 支持的语法:
(?(NYes|No (?(<Name>Yes|No (?('Name'Yes|No (?(?=AheadYes|No
(?(idyes_exp|no_exp:对应 id 的子表达式如果匹配到内容,则这里匹配 yes_exp,否则匹配 no_exp
(六)替换语法补充
一些在替换中使用的语法:
| 替换语法 | 作用 |
|---|---|
\l |
下一个字符输出小写 |
\L |
下一串字符输出小写 |
\u |
下一个字符输出大写 |
\U |
下一串字符输出大写 |
\E |
终止 \U 和 \L
|
| 语言 | 引用匹配之前的文本 | 引用匹配文本 | 引用匹配之后的文本 |
|---|---|---|---|
| Perl |
${^PREMATCH} | ${^MATCH}
|
${^POSTMATCH} |
(七) 标志
- 正则表达式开头加标志
-
i或IGNORECASE:忽略大小写,使匹配不区分大小写。 -
m或MULTILINE:启用多行模式 -
s或DOTALL:启用点字符(.)匹配任意字符,包括换行符。s是special的缩写。 -
x或VERBOSE:启用详细模式,忽略空格和注释,可以使用多行形式编写更易读的正则表达式。可以用[ ] \x20 (?-x:表示空格。x是extended缩写 -
g或GLOBAL: 查找所有符合条件的结果(Python 中不需要) - python 中 re.compile 的 flags 参数。flags 实质是一个数字,可以用
|按位与传入多个标志re.A或re.ASCII -
re.I或re.IGNORECASE -
re.M或re.MULTILINE -
re.S或re.DOTALL -
re.X或re.VERBOSE
(?flagspattern,如 (?imapple 表示不区分大小写
注释示例,匹配 <img> 标签:
pattern = re.compile(r"""(?ix # i 表示忽略大小写,x 表示开启注释模式
<img\s+ #标签的开始
[^>]*? #不是src的属性
src= #src属性的开始
(?P<quote>["'] #左引号
(?P<image_name>[^"'<>]+? #图片名字
(?P=quote #右括号
[^>]*? #不是src的属性
> #标签的结束
"""
二、Python正则表达式模块
模块级 :
| 方法、属性 | 作用 |
|---|---|
compile(pattern |
预先编译正则表达式,返回 re.Pattern 对象 |
search(pattern, string, flags=0 |
查找匹配的部分,返回 re.Match
|
match(pattern, string, flags=0 |
从头匹配,返回符合规则的第一个值 re.Match
|
fullmatch(pattern, string, flags=0 |
完全匹配(要从头到尾都匹配),返回 re.Match
|
split(pattern, string, maxsplit=0 |
用匹配到的内容作为分割符,分割后,返回列表 |
findall(pattern, string |
查找所有,返回为列表,元素为 str。如果有捕获组,则列表元素为 tuple,包含空结果。 |
finditer(pattern, string |
查找所有,返回为 re.Match 的迭代器。 |
sub(pattern, repl, string, count=0 |
返回替换后的字符串,repl 可以是一个函数(接收 Match,返回替换后的值) |
subn(pattern, repl, string, count=0 |
返回元组 (new_str, number,包含了替换次数 |
escape(pattern |
将特殊字符转义后返回,如 . 会返回 \.
|
purge( |
清除缓存 |
re.compile( 可以预先编译正则表达式,返回 re.Pattern 对象,以提高匹配效率
| 方法、属性 | 作用 |
|---|---|
.search(string[, pos[, endpos]] |
查找匹配的部分,返回 re.Match,pos 和 endpos 限制查找区间 |
.match(string[, pos[, endpos]] |
|
.fullmatch(string[, pos[, endpos]] |
|
.split(string, maxsplit=0 |
|
.findall( |
|
.finditer( |
|
.sub(repl, string, count=0 |
|
.subn(repl, string, count=0 |
|
.flags |
|
.groups |
有几个捕获组 |
.groupindex |
一个字典,命名捕获组与序号对应 |
.pattern |
re.Match 对象用于表示正则表达式匹配的结果:
| 方法、属性 | 作用 | |
|---|---|---|
Match.group([group1, ...] |
返回:捕获组,或多个捕获组 tuple | |
Match[0] |
等同于 group(0
|
|
.group( |
等同于 group(0
|
|
.groups(default=None |
返回:元组,所有的子捕获组 (1, 2, 3...。没有捕获到的组返回为 None。 | |
.groupdict(default=None |
返回:词典,只包含有命名的捕获组 | |
.start( |
返回:匹配的起始位置 | |
.end( |
返回:匹配的结束位置 | |
.span( |
返回:元组 (start, end | |
.expand(template |
用捕获到的组将 template 中的组引用展开 |
|
.pos |
匹配开始的索引位置 | |
.endpos |
匹配结束的索引位置 | |
.lastindex |
最后一个捕获组的索引 | |
.lastgroup |
最后一个捕获组的名字 | |
.string |
传入的字符串 |