这里是正则表达式常用表示法与函数,以备查询。
符号
普通符号
表示法 |
描述 |
示例 |
. |
匹配任意字符,\n除外 |
b.b,表示以b开头以b结尾的任意字符串 |
\d |
匹配0-9的数字字符 |
\d{3},表示3个数字 |
\w |
匹配任意字母数字下划线字符 |
\w+,至少一个字母数字下划线组合 |
\s |
匹配任何空格,与[\n\t\r\v\f]相同 |
\s\s+,至少2个空格 |
[…] |
匹配括号内字符集的任意单一字符 |
[aeiou],匹配aeiou这5个字符中的一个 |
[x-y] |
匹配x~y之间任意字符 |
[0-9],匹配0-9这10个数字,同\d |
\N |
匹配已保存的子组,N是子组的序号 |
\2,表示已匹配的第2个子组 |
\c |
c是一个特殊字符,匹配非转义的字符 |
\, \* |
literal |
表示字面值 |
输入什么,就匹配什么 |
\D |
与\d相反,匹配非数字 |
|
\W |
与\w相反,匹配非字母数字下划线 |
|
\S |
与\s相反,匹配非空格 |
|
辅助符号
表示法 |
描述 |
示例 |
* |
匹配0次或多次,默认贪婪 |
|
+ |
匹配1次或多次,默认贪婪 |
|
? |
匹配0次或1次,默认贪婪 |
|
{N} |
匹配N次 |
|
{M, N} |
匹配M~N次,默认贪婪 |
|
? |
在上述符号后面,加上?,转为非贪婪 |
|
| |
表示或,用在两个表达式之间 |
|
^(或者\A) |
匹配字符串起始部分 |
|
$(或者\Z) |
匹配字符串结束部分 |
|
[^…] |
不匹配字符集内的字符 |
|
\b |
表示在字符串边界,即开始或结尾 |
\bthe,表示以the开头字符串;\bthe\b,表示the |
\B |
与\b相反,表示不在边界 |
\Bthe,表示字符串不以the开头 |
扩展符号
表示法 |
描述 |
?iLmsux |
加入特殊标记 |
(?:…) |
括号内的匹配不分组 |
(?=…) |
匹配…出现在之后的位置 |
(?!…) |
匹配…不出现在之后的位置 |
(?<=…) |
匹配…出现在之前的位置 |
(?<!…) |
匹配…不出现在之前的位置 |
(?(id/name)Y/N) |
如果id或name对应的分组存在,则返回Y,否则返回N |
(?P…) |
由name标识而不是数字id标识的分组匹配 |
(?P=name) |
在同一个字符串中匹配由(?P)分组的文本 |
函数
常用函数
函数 |
描述 |
match(pattern, string, flags=0) |
从字符串起始位置,匹配1次,起始必须匹配 |
search |
从字符串左侧开始,匹配1次,起始不必匹配 |
findall |
查找所有匹配,返回列表 |
finditer |
查找所有匹配,返回迭代器 |
split(pattern, string, max=0) |
返回根据pattern分割后字符串列表,默认分割max次 |
sub(pattern, repl, string, count=0) |
替换所有匹配pattern并返回新字符串,默认替换无数次 |
groups |
返回包括所有匹配子组的元组,若无匹配,则为空元组 |
group(num=0) |
返回指定序号的子组,若编号为0,则返回整个匹配 |
常用模块属性
模块属性 |
描述 |
re.I, re.IGNORECASE |
不区分大小写 |
re.L, re.LOCALE |
根据使用的本地语言环境通过\w \W \b \B \s \S实现匹配 |
re.M, re.MULTILINE |
^ $ 分别匹配目标字符串每行的起始和结尾 |
re.S, re.DOTALL |
.点号可以匹配\n |
re.X, re.VERBOSE |
允许忽略字符串中换行符和注释段落,增强可读性 |
函数调用示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 增加(?i)使匹配忽略大小写
>>> re.findall(r'(?i)yes', 'yes? Yes. YES!')
['yes', 'Yes', 'YES']
# 增加(?im)表示匹配忽略大小写,^$从每行开始和结束匹配。
>>> re.findall(r'(?im)(^th[\w ]+)', """
... This line is the first,
... another line,
... that line, it's the best.
... """)
['This line is the first', 'that line']
# ?:使用表示不分组,?(1)表示判断分组1是否存在
# (?:(x)|y),表示x或者y,但x是一个子组,整体却不是。即如果匹配到x,x是一个子组;匹配到y,y不是子组。
# (?(1)y|x),表示匹配到的第一个子组如果存在,即x存在,那么下一个应该是y;若不存在,下一个则是x。
>>> pattern = r'(?:(x)|y)(?(1)y|x)'
>>> bool(re.search(pattern, 'xy'))
... True
|
文章作者
Shen Xiaobing
上次更新
2019-09-05
许可协议
CC BY-NC-ND 4.0 转载请注明作者和出处。