对于一个文本的字符串多行处理,如果使用split()函数,需要逐行处理,处理的代码也会比较复杂而且阅读体验感不是很好。re模块提供了的匹配函数,但是需要正则化相关的知识。
对于正则表达式样式使用 Python 的原始字符串表示法;在带有 'r' 前缀的字符串字面值中,反斜杠不必做任何特殊处理。 因此 r" " 表示包含 '' 和 '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 匹配空白字符[ fv]
S 匹配非空白字符[^ fv]
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