python中的正则匹配 - hainingwyx

时间:2024-03-11 13:12:43

python中的正则匹配

对于一个文本的字符串多行处理,如果使用split()函数,需要逐行处理,处理的代码也会比较复杂而且阅读体验感不是很好。re模块提供了的匹配函数,但是需要正则化相关的知识。

对于正则表达式样式使用 Python 的原始字符串表示法;在带有 \'r\' 前缀的字符串字面值中,反斜杠不必做任何特殊处理。 因此 r"\n" 表示包含 \'\' 和 \'n\' 两个字符的字符串,而 "\n" 则表示只包含一个换行符的字符串。 样式在 Python 代码中通常都会使用这种原始字符串表示法来表示。

特殊字符

\'.\'在默认模式,匹配除了换行的任意字符。

\'^\'匹配字符串的开头, 多行模式匹配换行后的首个符号。

\'$\'匹配字符串尾或者换行符的前一个字符,多行模式匹配换行符的前一个字符。

\'\'对它前面的正则式匹配0到任意次重复, 尽量多的匹配字符串。 ab 会匹配 \'a\', \'ab\'。

\'+\'对它前面的正则式匹配1到任意次重复。 ab+ 会匹配 \'a\' 后面跟随1个以上到任意个 \'b\',它不会匹配 \'a\'。

\'?\'对它前面的正则式匹配0到1次重复。 ab? 会匹配 \'a\' 或者 \'ab\'。

“{m}”对其之前的正则式指定匹配 m 个重复;少于 m 的话就会导致匹配失败。比如, a{6} 将匹配6个 \'a\' , 但是不能是5个

{m,n}?前一个修饰符的非贪婪模式,只匹配尽量少的字符次数。比如,对于 \'aaaaaa\', a{3,5} 匹配 5个 \'a\' ,而 a{3,5}? 只匹配3个 \'a\'。

[]用于表示一个字符集合。在一个集合中
符可以单独列出,比如 [amk]
特殊字符在集合中,失去它的特殊含义。比如 [(+)] 只会匹配这几个文法字符 \'(\', \'+\', \'\', or \')\'
支持\w or \S
不在集合范围内的字符可以通过 取反 来进行匹配。如果集合首字符是 \'^\' ,所有 不 在集合内的字符将会被匹配,比如 [^5] 将匹配所有字符,除了 \'5\'
在集合内要匹配一个字符 \']\',有两种方法,要么就在它之前加上反斜杠,要么就把它放到集合首位。比如, [()[]{}] 和 [{}] 都可以匹配括号。

\'|\' A|B, 匹配满足A或者B任意正则.

(...) 匹配括号中的正则表达式,也表示一个组。

(?:re) 类似(...),但是不是一个组

\d 匹配数字[0-9]

\D 匹配非数字字符[^0-9]

\s 匹配空白字符[ \t\n\r\f\v]

\S 匹配非空白字符[^ \t\n\r\f\v]

\w 匹配字符数字字符下划线[a-zA-Z0-9_]

\W 匹配非字符数字字符下划线[^a-zA-Z0-9_]

来看一个例子:

>>> import re  
>>> s = "adfad asdfasdf asdfas asdfawef asd adsfas " 

# 匹配字符串
 >>> reObj3 = re.compile(\'\w+\s+\w+\')  
>>> reObj3.findall(s)  
[\'adfad asdfasdf\', \'asdfas asdfawef\', \'asd adsfas\']  

# 匹配组
>>> reObj2 = re.compile(\'(\w+)\s+\w+\')  
>>> reObj2.findall(s)  
[\'adfad\', \'asdfas\', \'asd\']  

#匹配双重组
>>> reObj1 = re.compile(\'((\w+)\s+\w+)\')  
>>> reObj1.findall(s)  
[(\'adfad asdfasdf\', \'adfad\'), (\'asdfas asdfawef\', \'asdfas\'), (\'asd adsfas\', \'asd\')]  

findall函数返回的总是正则表达式在字符串中所有匹配结果的列表,此处主要讨论列表中“结果”的展现方式,即findall中返回列表中每个元素包含的信息。

1.当给出的正则表达式中不带括号时,列表的元素为字符串,此字符串为整个正则表达式匹配的内容。
2.当给出的正则表达式中带有一个括号时,列表的元素为字符串,此字符串的内容与括号中的正则表达式相对应(不是整个正则表达式的匹配内容)。
3.当给出的正则表达式中带有多个括号时,列表的元素为多个字符串组成的tuple,tuple中字符串个数与括号对数相同,字符串内容与每个括号内的正则表达式相对应,并且排放顺序是按括号出现的顺序。

参考文献

https://docs.python.org/zh-cn/2.7/library/re.html
https://zhuanlan.zhihu.com/p/37900841