元字符
\b
:代表单词的开头或结尾,为单词的交界处;虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。.
:匹配除了换行符以外的任意字符。*
:代表的是数量——它指定*
前边的内容可以连续重复使用任意次以使整个表达式得到匹配,匹配重复任意次(可能是0次)。.*
:任意数量的不包含换行的字符。+
:同*
,但匹配重复1次或更多次。-
不是元字符,只匹配它本身——连字符(或者减号,或者中横线,或者随你怎么称呼它)。
字符转义
如果你想查找元字符本身的话,比如你查找.,
或者*,
就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\
来取消这些字符的特殊意义。因此,你应该使用\.
和\*
。当然,要查找\
本身,你也得用\\
.
后向引用
后向引用用于重复搜索前面某个分组匹配的文本。如匹配go go
或自己指定子表达式的组名
零宽断言
-
零宽度正预测先行断言:
(?=exp)
,它断言自身出现的位置的后面能匹配表达式exp
。
例:\b\w+(?=ing\b)
,匹配以ing
结尾的单词的前面部分(除了ing
以外的部分);搜索I'm singing while you're dancing.
,匹配sing
和danc
。 -
零宽度正回顾后发断言:
(?<=exp)
,它断言自身出现的位置的前面能匹配表达式exp
。
例:(?<=\bre)\w+\b
,匹配以re
开头的单词的后半部分(除了re
以外的部分);搜索reading a book
,匹配ading
。
例:((?<=\d)\d{3})+\b
,要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),查找需要在前面和里面添加逗号的部分;搜索1234567890
,匹配234567890
。
例:(?<=\s)\d+(?=\s)
,匹配以空白符间隔的数字(再次强调,不包括这些空白符)。 -
负向零宽断言:只是想要确保某个字符没有出现,但并不想去匹配它。
例:\b\w*q[^u]\w*\b
,匹配里面出现了字母q,但是q后面跟的不是字母u的单词;搜索Iraq,Benq
,匹配Iraq
。 -
零宽度负预测先行断言:
(?!exp)
,断言此位置的后面不能匹配表达式exp。
例:\d{3}(?!\d)
,匹配三位数字,而且这三位数字的后面不能是数字。
例:\b((?!abc)\w)+\b
,匹配不包含连续字符串abc
的单词。 -
零宽度负回顾后发断言:
(?<!exp)
,断言此位置的前面不能匹配表达式exp。
例:(?<![a-z])\d{7}
,匹配前面不是小写字母的七位数字。 -
例:
(?<=<(\w+)>).*(?=<\/\1>)
,匹配不包含属性的简单HTML标签内里的内容。(?<= # 断言要匹配的文本的前缀 <(\w+)> # 查找尖括号括起来的内容 # (即HTML/XML标签) ) # 前缀结束 .* # 匹配任意文本 (?= # 断言要匹配的文本的后缀 <\/\1> # 查找尖括号括起来的内容 # 查找尖括号括起来的内容 ) # 后缀结束
贪婪与懒惰
- 规则:最先开始的匹配拥有最高的优先权。
- 贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。
例:a.*b
,匹配最长的以a
开始,以b
结束的字符串;搜索aabab
,匹配整个字符串aabab
。 - 懒惰匹配:匹配尽可能少的字符。
- 例:
a.*?b
,匹配最短的,以a
开始,以b
结束的字符串;搜索aabab
,匹配aab
。
查找项 | 正则表达式 |
---|---|
hi | \bhi\b |
hi 后面不远处跟着一个Lucy | \bhi\b.*\bLucy\b |
匹配1 个或更多连续的数字 | \d+ |
填写的QQ号必须为5 位到12 位数字 | ^\d{5,12}$ |
匹配3 位区号的电话号码 | \(0\d{2}\d)[- ]?\d{8}|0\d{2}[- ]?\d{8} |
描述一个正确的IP 地址 | ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) |
kitty kitty 或者go go | \b(\w+)\b\s+\1\b |
自己指定子表达式的组名 | \b(?<Word>\w+)\b\s+\k<Word>\b |
尚未详细讨论的语法
代码/语法 | 说明 |
---|---|
\a | 报警字符(打印它的效果是电脑嘀一声) |
\b | 通常是单词分界位置,但如果在字符类里使用代表退格 |
\t | 制表符,Tab |
\r | 回车 |
\v | 竖向制表符 |
\f | 换页符 |
\n | 换行符 |
\e | Escape |
\0nn | ASCII 代码中八进制代码为nn 的字符 |
\xnn | ASCII 代码中十六进制代码为nn 的字符 |
unnnn | Unicode 代码中十六进制代码为nnnn 的字符 |
\cN | ASCII 控制字符。比如\cC 代表Ctrl+C |
\A | 字符串开头(类似^ ,但不受处理多行选项的影响) |
\Z | 字符串结尾或行尾(不受处理多行选项的影响) |
\z | 字符串结尾(类似$ ,但不受处理多行选项的影响) |
\G | 当前搜索的开头 |
\p{name} | Unicode 中命名为name 的字符类,例如\p{IsGreek} |
(?>exp) | 贪婪子表达式 |
(?<x>-<y>exp) | 平衡组 |
(?im-nsx:exp) | 在子表达式exp 中改变处理选项 |
(?im-nsx) | 为表达式后面的部分改变处理选项 |
(?(exp)yes|no) | 把exp 当作零宽正向先行断言,如果在这个位置能匹配,使用yes 作为此组的表达式;否则使用no |
(?(exp)yes) | 同上,只是使用空表达式作为no |
(?(name)yes|no) | 如果命名为name 的组捕获到了内容,使用yes 作为表达式;否则使用no |
(?(name)yes) | 同上,只是使用空表达式作为no |
模块中的核心函数
函数 | 说明 |
---|---|
compile(pattern, flags=0) | 编译正则表达式返回正则表达式对象 |
match(pattern, string, flags=0) | 用正则表达式匹配字符串 成功返回匹配对象 否则返回None |
search(pattern, string, flags=0) | 搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回None |
split(pattern, string, maxsplit=0, flags=0) | 用正则表达式指定的模式分隔符拆分字符串 返回列表 |
sub(pattern, repl, string, count=0, flags=0) | 用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count 指定替换的次数 |
fullmatch(pattern, string, flags=0) | match 函数的完全匹配(从字符串开头到结尾)版本 |
findall(pattern, string, flags=0) | 查找字符串所有与正则表达式匹配的模式 返回字符串的列表 |
finditer(pattern, string, flags=0) | 查找字符串所有与正则表达式匹配的模式 返回一个迭代器 |
purge() | 清除隐式编译的正则表达式的缓存 |
re.I / re.IGNORECASE | 忽略大小写匹配标记 |
re.M / re.MULTILINE | 多行匹配标记 |
re.S / re.SINGLELINE | 单行匹配标识 |
IgnorePatternWhitespace | 忽略空白匹配 |
ExplicitCapture | 显式捕获,仅捕获已被显式命名的组 |
总结
符 号 | 解释 | 示例 | 说明 |
---|---|---|---|
. | 匹配任意字符 | b.t | 可以匹配bat / but / b#t / b1t 等 |
\w | 匹配字母/数字/下划线 | b\wt | 可以匹配bat / b1t / b_t 等,但不能匹配b#t |
\s | 匹配空白字符(包括\r 、\n 、\t 等) | love\syou | 可以匹配love you |
\d | 匹配数字 | \d\d | 可以匹配01 / 23 / 99 等 |
\b | 匹配单词的边界 | \bThe\b | |
^ | 匹配字符串的开始 | ^The | 可以匹配The 开头的字符串 |
$ | 匹配字符串的结束 | .exe$ | 可以匹配.exe 结尾的字符串 |
\W | 匹配非字母/数字/下划线 | b\Wt | 可以匹配b#t / b@t 等,但不能匹配but / b1t / b_t 等 |
\S | 匹配非空白字符 | love\Syou | 可以匹配love#you 等,但不能匹配love you |
\D | 匹配非数字 | \d\D | 可以匹配9a / 3# / 0F 等 |
\B | 匹配非单词边界 | \Bio\B | |
[] | 匹配来自字符集的任意单一字符 | [aeiou] | 可以匹配任一元音字母字符 |
[^] | 匹配不在字符集中的任意单一字符 | [^aeiou] | 可以匹配任一非元音字母字符 |
* | 匹配0 次或多次 | \w* | |
+ | 匹配1 次或多次 | \w+ | |
? | 匹配0 次或1 次 | \w? | |
{N} | 匹配N 次 | \w{3} | |
{M,} | 匹配至少M 次 | \w{3,} | |
{M,N} | 匹配至少M 次至多N 次 | \w{3,6} | |
| | 分支 | foo|bar | 可以匹配foo 或者bar |
(?#) | 注释 | ||
(exp) | 匹配exp 并捕获到自动命名的组中 | ||
(?<name>exp) | 匹配exp 并捕获到名为name 的组中 | ||
(?:exp) | 匹配exp 但是不捕获匹配的文本 | ||
(?=exp) | 匹配exp 前面的位置 | \b\w+(?=ing) | 可以匹配I'm dancing 中的danc |
(?<=exp) | 匹配exp 后面的位置 | (?<=\bdanc)\w+\b | 可以匹配I love dancing and reading 中的第一个ing |
(?!exp) | 匹配后面不是exp 的位置 | ||
(?<!exp) | 匹配前面不是exp 的位置 | ||
*? | 重复任意次,但尽可能少重复 | a.*b ,a.*?b | 将正则表达式应用于aabab ,前者会匹配整个字符串aabab ,后者会匹配aab 和ab 两个字符串 |
+? | 重复1 次或多次,但尽可能少重复 | ||
?? | 重复0 次或1 次,但尽可能少重复 | ||
{M,N}? | 重复M 到N 次,但尽可能少重复 | ||
{M,}? | 重复M 次以上,但尽可能少重复 |
注意:如果需要匹配的字符是正则表达式中的特殊字符,那么可以使用\
进行转义处理,例如想匹配小数点可以写成\.
就可以了,因为直接写.
会匹配任意字符;同理,想匹配圆括号必须写成\(
和\)
,否则圆括号被视为正则表达式中的分组。
超好用的测试正则的软件
百度网盘下载链接:https://pan.baidu.com/s/11jF03jPcrGxgGhNgciB6qQ;
提取码:nz29。