正则表达式基本语法
元字符,行首和行尾,转义、重复
或 分组 / 捕获
断言(零宽断言、负向零宽断言)
贪婪和非贪婪
引擎选项:IgnoreCase(忽略大小写)、Singleline(单行模式)、Multiline(多行模式)

正则表达式测试工具


元字符


  • 元字符都是匹配一个字符
  • 大小写互为反如\d(任意一个数字)和\D(任意一个非数字)
  • []中的^,注意区别单独的^
元字符 解释 备注
. 匹配除换行符以外的任意一个字符
[] 字符集合,匹配 [] 中包含的任意一个字符 [abc]
[^] 匹配除字符集合内字符外的任意一个字符 [^abc] [^0-9]
[-] 字符范围 [0-9a-zA-Z]
\b \B (不)匹配单词边界 border
\d \D 分别等效于[0-9] [^0-9] digital
\s \S (不)匹配空白字符,包含换行符,制表符,空格,等价于[\f\r\n\t\v] space
\w \W 等价于[a-zA-Z0-9]还包括中文 / [^a-zA-Z0-9] 和非中文

行首和行尾


  • 行首,以某字符开头,^: 区别于[^]
  • 行尾,以某字符结尾,$

转义


在正则表达式中有特殊意义的符号,想使用原意,需要使用\转义如\\

重复


元字符 解释 备注
* 前面的正则表达式重复 0 次或多次
+ 前面的正则表达式重复至少一次
? 前面的正则表达式重复 0 次或者 1 次 有还是没有,可有可无
{n} {n,} {n,m} 重复 n 次,重复至少 n 次,重复 n 到 m 次


  • |:如匹配 abc 或 abd:abc|abd,不能写成 abc|d,可写成ab(c|d)ab[cd]

捕获 / 分组


  • 分组:使用小括号(表达式)指定的表达式,也叫捕获,捕获后自动分组,分配组号从 1 开始 group1
  • match 为 group0
  • \数字:匹配对应的分组号

举例理解(结合工具):正则表达式(ve)ry \1 来匹配 very very:match 为 very ve即group0,group1是ve
\1 是在正则表达式中用来拿到 (ve)ry 匹配的第一个分组(这里就一个分组)ve,然后替换掉放在正则表达式中即正则表达式为 very ve,然后再去匹配文本,得到 match 为 very ve,group1 仍为 ve

  • 不捕获分组:(?:表达式)
  • 命名分组捕获:(?<分组名>表达式),在 python 中使用(?P<分组名>表达式)
  • 应用场景:常用于分组替换,匹配并分组然后修改指定组,其他分组不变

断言


  • 断言只是正则表达式的条件不参与分组 / 捕获,也不参与分组
  • 结合工具查看 match,且查看是否有 group

零宽断言

  • (?=exp):零宽度正预测先行断言
    • 断言 exp 一定在匹配的右边出现

如在 feet feed foot food 文本中匹配后面有 oo 的 f,正则表达式可以表示为 f(?=oo)

  • (?<=exp):零宽度正回顾后发断言,<可理解为左
    • 断言 exp 一定在匹配的左边出现

负向零宽断言

  • 与零宽断言相反
  • (?!exp):零宽度负预测先行断言,!可理解为不等于
    • 断言 exp 一定不会出现在右侧
  • (?<!exp):零宽度负回顾后发断言
    • 断言 exp 一定不会出现在左侧

贪婪和非贪婪


  • 默认模式是贪婪的,也就是说尽可能匹配更长的字符串
  • 非贪婪是针对重复的:* + ? {n,} {n,m}
  • 非贪婪:在重复的符号前加?,尽量少的匹配
贪婪 非贪婪 备注
*:重复 0 次或任意次 *?:重复任意次,但尽可能的少重复
+: 重复至少一次 +?: 重复至少一次 ,但尽可能的少重复 如在 food took wood feet 文本中用正则表达式 f.+d 则会 match food took wood(贪婪),如果用非贪婪 f.+?d 则只 match food
? : 重复 0 次或者 1 次 ?? : 重复 0 次或者 1 次,但尽可能的少重复
{n,} {n,m}: 重复至少 n 次 / 重复 n 次到 m 次 {n,}? {n,m}?: 重复至少 n 次 / 重复 n 次到 m 次,但尽可能的少重复

引擎选项


IgnoreCase(忽略大小写)、Singleline(单行模式)、Multiline(多行模式)

选项 说明 Python 解释
IgnoreCase 匹配时忽略大小写 re.I re.IGNORECASE
Singleline 单行模式,.可以匹配所有字符,包含换行符 \ n re.S re.DOTALL .的匹配有影响,是否能够匹配换行符
Multiline 多行模式(以换行符来界定),对^行首、$行尾有影响 re.M re.MUTILINE 重新定义了行,对^$的界定有影响
默认模式 对匹配的文本当做单行文本,只是.只能匹配除换行符以外的任意字符 非单行模式,非多行模式,没对.匹配进行增强
  • 单行模式:
    • .可以匹配所有字符,包括换行符
    • ^ 表示整个字符串的开头$表示整个字符串的结尾
  • 多行模式:
    • .可以匹配除了换行符之外的字符,多行不影响.点号
    • ^ 表示行首,$行尾,只不过这里的行是每一个行
  • 默认模式:
    • 可以看做待匹配的文本是一行,不能看做多行
    • .点号不能匹配换行符
    • ^$表示行首和行尾,而行首行尾就是整个字符串的开头和结尾

简单讲:
单行模式和默认模式对待匹配的文本都是一行,只是单行模式对.有影响
多行模式重新定义行,影响了^$