在多行上匹配表达式时,我总是使用re.DOTALL
并且它工作正常。现在我偶然发现了re.MULTILINE
字符串,看起来它正在做同样的事情。
来自re
模块(不会更清楚,但值不同):
M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline
S = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline
SRE_FLAG_MULTILINE = 8 # treat target as multiline string
SRE_FLAG_DOTALL = 16 # treat target as a single string
那么使用方法是否存在差异,以及可以返回不同内容的微妙案例是什么?
答案 0 :(得分:6)
他们完全不同。是的,两者都会影响新行的处理方式,但它们会切换不同概念的行为。
re.MULTILINE
会影响^
和$
主播匹配的位置。
如果没有切换,^
和$
仅分别匹配整个文本的开头和结尾。使用开关,它们也可以在换行符之前或之后匹配:
>>> import re
>>> re.search('foo$', 'foo\nbar') is None # no match
True
>>> re.search('foo$', 'foo\nbar', flags=re.MULTILINE)
<_sre.SRE_Match object; span=(0, 3), match='foo'>
re.DOTALL
会影响.
模式可以匹配的内容。
如果没有切换,.
会匹配除换行符之外的任何字符 。通过切换,新线也匹配:
>>> re.search('foo.', 'foo\nbar') is None # no match
True
>>> re.search('foo.', 'foo\nbar', flags=re.DOTALL)
<_sre.SRE_Match object; span=(0, 4), match='foo\n'>
答案 1 :(得分:3)
它没有做同样的事情,DOTALL
也匹配换行符,而MULTILINE
使^
和$
能够在每一行上工作。
示例:
The quick brown fox
jumps over the lazy dog.
在这里,.+
将产生两个结果(第一行和第二行),没有DOTALL
模式。如果启用DOTALL
,则会匹配整个短语。
The quick brown fox
jumps over the lazy dog.
此处,即开启^\w+
模式的MULTILINE
,将匹配两次,因为每个行的开头都有字符。< / p>