正则表达式

Regex

Posted by BlueFat on Thursday, August 18, 2022

基本语法

代码 说明
. 匹配除换行符外任意一个字符
[abc] 字符集合,匹配集合中包含的任意一个字符
[^abc] 字符集合,匹配非集合内的任意一个字符
[a-z] 字符集合范围,匹配所包含的任意一个字符
[^a-z] 匹配非集合内字符的任意一个字符
\b 匹配字符的边界
\B 匹配非字符的边界
\d 匹配1位数字,同[0-9]
\D 匹配1位非数字, 同[^0-9]
\s 匹配1位空白字符,空格、换行符、制表符、换页符 [ \f\r\n\t\v]
\S 匹配1位非空白字符
\w 匹配[a-zA-Z0-9_ ],包括中文的字
\W 匹配\w之外的字符
^ 匹配字符以行首开头
$ 匹配字符以行结尾
匹配手机号1388888888  
\d{11}
匹配座机 025-83201043、0755-94324243
\d{3,4}-\d{7,8}

重复

代码 说明
* 表示前面的正则表达式会重复0次或多次
+ 表示前面的正则表达式重复至少1次
? 表示前面的正则表达式会重复0次或1次
{n} 重复固定的n次
{n,} 重复至少n次
{n,m} 重复n到m次

分组

代码 说明 举例
(pattern) 使用小括号指定表达式,会得到分组,捕获后自动分配组号从1开始,使用\1可引用,可以改变优先级
\数字 引用对应的分组 (good) \1匹配good good, 但捕获的组group是good
(?:pattern) 改变优先级,不需要分组 (?:f|w)ood 等价 food|wood
?<name>exp) 或 (?’name’exp) 命名分组捕获,通过name访问分组 Python语法是(?P<name>exp)

贪婪与非贪婪

默认是贪婪模式,也就是说尽量多匹配更长的字符串。 非贪婪很简单,在重复的符号后面加上一一个?问号,就尽量的少匹配了。

代码 说明
*? 匹配任意次,但尽可能少重复
+? 匹配至少1次,,但尽可能少重复
?? 匹配0次或1次,,但尽可能少重复
{n,}? 匹配至少n次,但尽可能少重复
{n,m}? 匹配至少n次,至多m次,但尽可能少重复

单行和多行模式

代码 说明 Python
IgnoreCase 匹配时忽略大小写 re.I或 re.IGNORECASE
Singleline 单行模式.可以匹配所有字符,包括\n re.S或 re.DOTALL
Multiline 多行模式^行首、$ 行尾 re.M或re.MULTILINE
IgnorePatternWhitespace 忽略表达式中的空白字符,如果要使用空白字符用转义,#可以用来做注释 re.X或re.VERBOSE
  • 单行模式: .可以匹配所有字符,包括\n换行符 ^表示整个字符串的开头,$整个字符串的结尾

  • 多行模式: 可以匹配除了换行符之外的字符,多行不影响.点号 ^表示行首,$行尾,只不过这里的行是每一个行


  • 默认模式:可以看做待匹配的文本是- -行,不能看做多行,. 点号不能匹配换行符,^和$表示行首和行尾,而行首行尾就是整个字符串的开头和结尾

  • 单行模式:基本和默认模式一样,只是.点号终于可以匹配任意一个字符包括换行符,这时所有文本就是一个长长的只有一行的字符串。^就是这一行字符串的行首,$就是这一行的行尾。

  • 多行模式:重新定义了行的概念,但不影响.点号的行为,^和$还是行首行尾的意思,只不过因为多行模式 可以识别换行符了。“开始"指的是\n后紧接着下一个字符;“结束"指的是\n前的字符,注意最后一行结尾可以没有\n

简单讲,单行模式只影响.点号行为,多行模式重新定义行影响了^和$ 注意:注意字符串中看不见的换行符, \r\n会影响e$的测试,e$ 只能匹配e\n

断言

高级用法(可不掌握) 断言不参与输出 零宽断言 测试字符串为wood took foot food

代码 说明 举例
(?=exp) 零宽度正预测先行断言,断言exp一定在匹配的右边出现,断言后面一定跟个exp f(?=oo) f后面一定有oo出现,但断言不参与输出,即只输出f
(?<=exp) 零宽度正回顾后发断言, 断言exp一定出现在匹配的左边出现,断言前面一定有个exp前缀 (?<=f)ood、(?<=t)ook分别匹配ood、ook,ook前一定有t出现

负向零宽断言

代码 说明 举例
(?!exp) 零宽度负预测先行断言,断言exp一定不会出现在右侧,也就是说断言后面一定不是exp \d{3}(?!\d)匹配3位数字,断言3位数字后面一定不能是数字 foo(?!d) foo后面一定不是d
(?<!exp) 零宽度负回顾后发断言,断言exp-定不能出现在左侧,也就是说断言前面一定不能是exp (?<!f)ood ood的左边一定不是f