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

时间:2017-01-12 18:08:54

标签: 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

那么使用方法是否存在差异,以及可以返回不同内容的微妙案例是什么?

2 个答案:

答案 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>