This question already has answers here:
Difference between regular expression modifiers 'm' and 's'?
(3个答案)
2年前关闭。
在多行上匹配表达式时,我总是使用
在
用法上有区别吗?在什么情况下它可以返回不同的东西?
没有开关,
(3个答案)
2年前关闭。
在多行上匹配表达式时,我总是使用
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
用法上有区别吗?在什么情况下它可以返回不同的东西?
最佳答案
他们是完全不同的。是的,两者都影响换行符的处理方式,但是它们会切换不同概念的行为。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'>
10-06 10:31