正则表达式
分类
- BRE
基本正则表达式,grep sed vi等软件支持.vim由扩展 - ERE
扩展正则表达式,egrep (grep-E) sed -r等 - PCRE
几乎所有好几语言都是PCRE的方言或者变种.python从1.6开始使用SRE正则表达式殷勤,可以认为是PCRE的子集,见模块re
基本语法
元字符 metacharacter
元字符 | 说明 |
---|---|
. | 匹配除换行符外任意一个字符 |
[abc] | 字符集和,只能表示一个字符位置.匹配所包含的任意一个字符 |
[^abc] | 字符集和,只能表示一个字符位置.匹配除集合包含的任意一个字符 |
[a-z] | 字符范围,也是个集合,表示一个字符位置,匹配所包含的任意一个字符 |
[^a-z] | 字符范围,表示一个字符位置,匹配除去集合内字符的任意一个字符 |
\b | 匹配单词的边界 |
\B | 不匹配单词的边界 |
\d | 等价于[0-9]匹配一位数字 |
\D | 等价于[^0-9]匹配一位非数字 |
\s | 匹配1位空白字符,包括换行符 制表符 空格 [\f\r\n\v] |
\S | 匹配一位非空白字符 [^\f\r\n\v] |
\w | 匹配一位包括下划线和中文的任何单词字符,类似于[A-Za-z0-9_] |
\W | 匹配任何非单词字符,等价于[^A-Za-z0-9_] |
重复
元字符 | 说明 |
---|---|
* | 表示前面正则表达式会重复0次或多次 |
+ | 表示前面的正则表达式重复至少1次 |
? | 表示前面的正则表达式会重复0次或1次 |
{n} | 重复固定的n次 |
{n,} | 重复至少n次 |
{n,m} | 重复n到m次 |
元字符 | 说明 | 举例 |
---|---|---|
x|y | 匹配x或者y | wood took foot food 使用w|food或者(w|f)ood |
捕获 | 使用小括号指定一个子表达式,也叫分组,捕获后会自动分配组好从1开始,可以改变优先级 | |
\数字 | 匹配对应的分组 | (very)\1very very,但捕获的组group是very |
(?:pattern) | 如果仅仅为了改变优先级,就不需要捕获分组 | (?:w|f)ood |
(?<name>exp)(?'name’exp) | 命名分组捕获,但是可以通过name访问分组,python语法必须是(?P<name>exp) | |
零宽断言 | ||
(?=exp) | 零宽度正预测先行断言,断言exp一定在匹配的右边出现,也就是说断言后面一定跟个exp | f(?=oo)f后面一定有oo出现 |
(?<=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 |
(?#comment) | 注释 | f(?=oo)(?#这个后断言不捕获) |
分组和捕获是同一个意思
使用正则表达式时,能用简单表达式,就不要复杂的表达式
贪婪与非贪婪
默认是贪婪模式,就是尽量多匹配更长的字符串
非贪婪,在重复的符号后面加上一个?问号,就尽量少的匹配了
代码 | 说明 | |
---|---|---|
*? | 匹配任意次,但尽可能少重复 | |
+? | 匹配至少1次,但尽可能少重复 | |
?? | 匹配0次或1次,但尽可能少重复 | |
{n,}? | 匹配至少n次,但尽可能少重复 | |
{n,m}? | 匹配至少n次,至多m次,尽可能少重复 |
引擎选项
代码 | 说明 | Python |
---|---|---|
lgnoreCase | 匹配时忽略大小写 | re.l re.IGNORECASE |
Singleline | 单行模式,可以匹配所有字符,包括\n | re.S re.DOTALL |
Multiline | 多行模式^行首 $行尾 | re.M re.MULTILINE |
IgnorePatternWhitespace | 忽略表达式中的空白字符,如果要使用空白字符用转义,#可以用来做注释 | re.X re.VERBOSE |
单行模式:
. 可以匹配所有字符,包括换行符
^ 表示整个字符串的开头,$整个字符串的结尾
多行模式:
. 可以匹配除了换行符之外的字符,多行不影响.点
^ 表示行首,$行尾,这里是每一个行
默认模式:可以看做匹配的文本是一行,不能看做多行, .点号不能匹配换行符,^和$表示行首和行尾,而行首行尾就是整个字符串的开头和结尾
单行模式:基本和默认模式一样,只是.点号终于可以匹配任意一个字符包括换行符,这是所有文本就是一个长长的只有一行的字符串.^就是这一行字符串的行首,$就是这一行的行尾.
多行模式:重新定义了行的概念,但不影响.点号的行为,^和$还是行首行尾的意思,只不过因为多行模式可以识别换行符了."开始"指的是\n前的字符,注意最后一行结尾可以没有\n
简单讲,单行模式只影响.点号行为,多行模式重新定义行影响了^和$
注意:字符串中看不见的换行符,\r\n会影响e$的测试,e$只能匹配e\n