基本语法
代码 | 说明 |
---|---|
. | 匹配除换行符外任意一个字符 |
[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 |