re.DOTALL和re.MULTILINE有什么区别?

Jea*_*bre 1 python regex

当在多行上匹配一个表达式时,我总是使用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
Run Code Online (Sandbox Code Playgroud)

用法上有区别吗?在什么情况下它可以返回不同的东西?

Mar*_*ers 7

他们是完全不同的。是的,两者都影响换行符的处理方式,但是它们会切换不同概念的行为。

  • 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'>
    
    Run Code Online (Sandbox Code Playgroud)
  • 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'>
    
    Run Code Online (Sandbox Code Playgroud)


Jan*_*Jan 6

它没有做同样的事情,DOTALL也匹配换行符,同时MULTILINE启用^$在每一行上工作。

例子:

The quick brown fox 
jumps over the lazy dog.
Run Code Online (Sandbox Code Playgroud)

在这里,.+将产生两个没有众数的结果(第一行和第二行)DOTALL。如果DOTALL打开,则匹配整个短语。

The quick brown fox 
jumps over the lazy dog.
Run Code Online (Sandbox Code Playgroud)

在这里,即模式打开^\w+时,将匹配两次,因为每行 开头MULTILINE都有一个单词字符