这里是正则表达式常用表示法与函数,以备查询。

符号

普通符号

表示法 描述 示例
. 匹配任意字符,\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