当在多行上匹配一个表达式时,我总是使用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'>