Python的re模块中, search
、 findall
、 match
等函数的参数都是 (pattern,string,flags)
, 第三个参数 flags
有忽略大小写的re.I, 让模式更易读的re.X等, 而其中re.S和re.M比较难理解, 下面介绍一下。
本来, ^
只匹配字符串的开头, $
只匹配字符串结尾, .
不匹配换行符。 因此对下面一段文字, 结尾在第三行, 而.不能匹配换行符, 因此以下的 pattern
什么都匹配不到:
text = """First line.
Second line.
Third line."""
pattern = "^(.*?)$"
print(re.findall(pattern, text)) # 输出为[]
re.S做的事情是: 让.也匹配换行符。
re.M做的事情是: 让^匹配每行的开头,$匹配每行的结尾。
因此用 re.S
, pattern
就能匹配到整个字符串:
# 让.匹配换行符
print(re.findall(pattern, text, re.S))
# 输出为 ['First line.\nSecond line.\nThird line.']
要想匹配每一行, 则用 re.M
:
# 让^、$匹配每行的开头、结尾
print(re.findall(pattern, text, re.M))
# 输出为 ['First line.', 'Second line.', 'Third line.']
换句话说,使用了 re.M
以后,运行效果看起来就像是程序首先根据换行符把字符串拆分成了多个子字符串,然后再在子字符串中执行正则表达式。