【问题标题】:What's the difference between re.DOTALL and re.MULTILINE? [duplicate]re.DOTALL 和 re.MULTILINE 有什么区别? [复制]
【发布时间】:2017-05-27 23:14:42
【问题描述】:

当匹配多行的表达式时,我总是使用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

那么在用法上有什么不同吗?在哪些微妙的情况下它可以返回不同的东西?

【问题讨论】:

  • 我很高兴有这个 python 特定的问题。所谓的“重复”对我没有帮助。
  • 谢谢!所有的事情都认为我要关闭它。 Martjin 回答后,无需添加任何内容 :) 因重复而关闭并不一定是坏事,在这种情况下,它可以让您找到问题并得到答案,所以它很有用。
  • 但我取消删除它,因为我觉得标题关键字对未来的用户有用(查看上面的评论:))

标签: python regex


【解决方案1】:

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

  • 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'>
    

【讨论】:

    【解决方案2】:

    它不是在做同样的事情,DOTALL 也匹配换行符,而MULTILINE 使^$ 可以在每一行上工作。

    例子:

    The quick brown fox 
    jumps over the lazy dog.
    

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

    The quick brown fox 
    jumps over the lazy dog.
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-23
      • 2013-02-13
      • 2011-04-26
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多