Skip to content

regular expression in python

这里主要对 python 正则表达式相关的内容进行整理。python 的正则表达式包括对 python 正则表达式语法的支持和相应的库,python 支持的正则表达式的语法是兼容Perl 的正则表达式语法,同时 python 内部支持 rstring 也就是 raw string(原始 string, 不转义的 string)来帮助方便的表示正则表达式。

语法速记

符号含义
.匹配所有除了空行之外的字符,当DOTALL标记被设置的时候,连空行也会被匹配
^匹配字符串的开头,在MULTILINE模式下会匹配多行的开头
$更像是一个占位符,用来匹配字符串的结尾或者一行的结束('\n'),在MULTILINE模式下会产生多次匹配
*对前面给出的正则表达式产生0-n次匹配
+对前面给出的正则表达式产生1-n次匹配
?对前面给出的正则表达式产生0或者1次匹配
*? +? ??在前三个通配符后面加?用来消除前三个符号的贪婪特性(永远期望得到最长匹配串的特性),在这三个符号后面加问号之后,现在一旦达到了匹配的要求,匹配直接停止
{m}对前面的正则表达式复制m次
{m,n}对前面的正则表达式复制m-n次,缺省m默认表示0,缺省n默认表示无穷
{m,n}?消除前面那种正则表达式的贪婪匹配
\转义
[]能够匹配[]中描述字符集中的任何一个情况。
1. [abc]这样'a''b''c'其中之一出现就会被匹配。
2. [a-z]描述范围,[-z][a-]但是'-'出现在开头或者结尾的时候失去这个意义
3. [^]表示取反,只有这个字符位于开头的时候才表示对后续字符集中表示的内容取反。
4. [\w \S] 在方括号表示法中也能被接受。
5. 要匹配']'需要转义,或者把这个放在开头。
|'|'左右两边的正则表达式其中有一个满足就匹配成功,这是贪婪的短路的,左边匹配成功之后不会再去管右边匹配是否成功。
(...)匹配括号之间的任何字符,称括号内的正则表达式为一个组
(?:...)指示一个非捕获组
(?aiLmsux)用来代替flag的传入,比如说我原来想在构造函数中传入re.A等字符,现在可以通过在正则表达式的开头传入这种非捕获组的方式快速传参
(?aiLmsux-imsx:...)减号后的相关属性被排除
(?>...)原子组,最大程度的贪婪匹配,如果匹配不完全符合正则表达式,就舍弃所有的结果
(?P<name>...)给组起名字
(?P=name)引用正则表达式中之前定义的组,匹配规则和之前定义的组相同
(?#...)注释,不起到任何作用
(?=...)前向断言,向前看而不产生匹配,等于说在确定后面部分符合模式的情况下匹配前面的部分,零宽断言
(?!...)反向的前向断言,等于说在确定后面部分不符合模式的情况下匹配前面的部分,和前向断言刚好相反,零宽断言
(?<=...)前向的回顾断言,零宽断言,向后看(更早出现的字符串位置)而不产生匹配,等于说在确定字符串前面部分的情况下匹配字符串的后面部分
(?&<!...)和上面一样同理
(?(id/name)yes-pattern|no-pattern)如果前面的组匹配到了就匹配yes部分,没有匹配到就匹配no部分

匹配而不捕获

python 的 re 模块中提供了诸如 (?...) 的方式来表示非捕获组来表示匹配而不捕获。这个特性有如下的作用:

  1. 提高性能。减少捕获的内容减缓了内存。
  2. 防止冗余的捕获。有时候只对产生匹配的一部分内容感兴趣,就可以放弃一些不感兴趣的内容。

特殊字符速记

特殊字符含义
\number指定组号,组号从1开始,这个特殊字符产生和之前组号一样的正则表达式
\A匹配字符串开始
\b匹配\w或者\W之间的边界,\b可以匹配这个边界的开始或者结束
\B\b的相反形式,匹配空字符串,但是这个空字符串不能是\w或者\W之间的边界,这是零宽断言
\d匹配[0-9]
\D\d的相反形式,除了[0-9]之外
\s匹配空白字符,[ \t\n\r\f\v]
\S\s的相反形式
\w[a-zA-Z0-9_]
\W\w的相反形式
\Z只匹配字符串末尾

re 模块定义的标记

re标记含义
re.A
re.ASCII
只匹配ASCII字符
re.DEBUG展示编译的表达式信息
re.I
re.IGNORECASE
忽略大小写
re.L
re.LOCALE
让正则表达式适应区域设置
re.M
re.MULTILINE
让正则表达式进行多行匹配。
原先的正则表达式都是遇到'\n'就匹配一次,一个字符串中包含多行就会匹配多次,现在即使一个字符串中存在多行也只匹配一次
re.NOFLAG不指定任何flag
re.S
re.DOTALL
让'.'等指代任何字符,未设置这个选项的时候只能指代除了空行之外的任何字符
re.U
re.UNICODE
让正则表达式能够匹配unicode
re.X
re.VERBOSE
能够编写详细版的正则表达式,空白在正则表达式中被忽略,并且能够为正则表达式添加注释

re 模块定义的方法 和 re.Pattern 相关的方法

re方法和Pattern方法含义
match从开头开始进行匹配,没有合适匹配的时候返回None
search从字符串的任何地方开始查找匹配,除非特别指定从字符串开始处开始,没有合适匹配的时候返回None
fullmatch完全匹配才返回Match,也就是说除了匹配到的字符串之外不能有其他的字符串不匹配部分
split根据正则表达式分割字符串,在模式匹配成功的时候,开始对字符串分割,即去掉模式匹配的部分,把字符串分成两半,然后放到列表里返回。当传入的模式匹配串是捕获组的时候,匹配到的字符串也会在列表中被返回。
findall进行模式匹配,返回list,list中的对象可以是元组,用于处理模式匹配多个捕获组的情况
sub模式匹配并替换
subn同sub,最后返回元组(替换后的字符串,替换的次数)
escape为传入的字符串添加转义
purge清除re的cache

re.Match

Match中相关的方法和变量含义
expand更多的情况是创建替换用的模板,感觉没什么用
group提取捕获组。传入组号或者组名获取结果。传入组号为0的时候获取所有捕获组结果。
groups返回所有捕获组信息。可以传入参数用于处理捕获组没有捕获到的情况。
groupdict返回字典,包含捕获组名称和捕获组值的信息。
start,end返回某个组的开始下标和结束下标
span元组的形式返回资格组的就开始下标和结束下标
Match.pos这个变量指示对原始字符串从哪里开始匹配
Match.endpos指示原始字符串从哪里匹配结束
Match.lastindex最后一个捕获组的下标
Match.lastgroup最后一个捕获组的名称
Match.re指向产生这个match的re对象,可能是pattern也可能就是re函数
Match.string指向原始字符串

re.error 触发

只有在传入的正则表达式字符串不合 python 正则表达式语法的时候会抛出异常,字符串模式匹配失败的时候绝对不会触发异常。