This question already has answers here:
Difference between regular expression modifiers 'm' and 's'?
                                
                                    (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