正则表达式基本语法
元字符,行首和行尾,转义、重复
或 分组 / 捕获
断言(零宽断言、负向零宽断言)
贪婪和非贪婪
引擎选项:IgnoreCase(忽略大小写)、Singleline(单行模式)、Multiline(多行模式)
正则表达式测试工具
- mac:正则表达式测试工具mac
- windows: 正则表达式测试工具win
- 其他: 各种在线测试工具
元字符
- 元字符都是匹配一个字符
- 大小写互为反如
\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 | 重新定义了行,对^ 和$ 的界定有影响 |
默认模式 | 对匹配的文本当做单行文本,只是. 只能匹配除换行符以外的任意字符 |
非单行模式,非多行模式,没对. 匹配进行增强 |
- 单行模式:
.
可以匹配所有字符,包括换行符^
表示整个字符串的开头,$
表示整个字符串的结尾
- 多行模式:
.
可以匹配除了换行符之外的字符,多行不影响.
点号^
表示行首,$
行尾,只不过这里的行是每一个行
- 默认模式:
- 可以看做待匹配的文本是一行,不能看做多行
.
点号不能匹配换行符^
和$
表示行首和行尾,而行首行尾就是整个字符串的开头和结尾
简单讲:
单行模式和默认模式对待匹配的文本都是一行,只是单行模式对.
有影响
多行模式重新定义行,影响了^
和$