代码之家  ›  专栏  ›  技术社区  ›  k6ps

如何匹配多行字符串中的行首和行尾

  •  3
  • k6ps  · 技术社区  · 6 年前

    我希望在多行字符串中匹配整行(此代码是检查正确输出格式的单元测试的一部分)。

    Python 3.5.2 (default, Nov 12 2018, 13:43:14) 
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import re
    >>> re.match(r".*score = 0\.59.*", r"score = 0.65\nscore = 0.59\nscore = 1.0", re.MULTILINE)
    <_sre.SRE_Match object; span=(0, 39), match='score = 0.65\\nscore = 0.59\\nscore = 1.0'>
    

    这很好,我可以匹配多行字符串中的任何内容。但是,我想确保我匹配整个行。文件上说 ^ $ 应与行首和行尾匹配 re.MULTILINE 使用。然而,这在某种程度上并不适用于我:

    >>> re.match(r".*^score = 0\.59$.*", r"score = 0.65\nscore = 0.59\nscore = 1.0", re.MULTILINE)
    >>> 
    

    下面是我做的更多实验:

    >>> import os
    >>> re.match(r".*^score = 0\.59$.*", "score = 0.65{}score = 0.59{}score = 1.0".format(os.linesep, os.linesep), re.MULTILINE)
    >>>
    >>> re.match(r".*^score = 0\.65$.*", "score = 0.65{}score = 0.59{}score = 1.0".format(os.linesep, os.linesep), re.MULTILINE)
    <_sre.SRE_Match object; span=(0, 12), match='score = 0.65'>
    >>> re.match(r".*^score = 0\.65$.*", r"score = 0.65\nscore = 0.59\nscore = 1.0", re.MULTILINE)
    >>> 
    

    我想我遗漏了一些很简单的东西,但我想不出来。

    3 回复  |  直到 6 年前
        1
  •  3
  •   Jean-François Fabre    6 年前

    \n \ n 在模式中 ,但不在输入字符串中。

    此外,即使在那里不重要,也要始终使用 flags= 关键字,因为某些regex函数有一个额外的 count 这可能导致错误。

    这样地:

    re.match(r".*^score = 0\.65$.*", "score = 0.65\nscore = 0.59\nscore = 1.0", flags=re.MULTILINE)
    <_sre.SRE_Match object; span=(0, 12), match='score = 0.65'>
    

    正如我在评论中提到的, .* 需要 re.DOTALL 匹配换行符

    >>> re.match(r".*^score = \d+\.\d+$.*", "score = 0.65\nscore = 0.59\nscore = 1.0", re.MULTILINE|re.DOTALL)
    <_sre.SRE_Match object; span=(0, 37), match='score = 0.65\nscore = 0.59\nscore = 1.0'>
    

    (如 Python regex, matching pattern over multiple lines.. why isn't this working? How do I match any character across multiple lines in a regular expression? 其中 能够 如果不是原始字符串位,则是副本)

    (对不起,我的浮点正则表达式可能有点弱,您可以在附近找到更好的正则表达式)

        2
  •  2
  •   Tim Biegeleisen    6 年前

    您需要与非原始字符串匹配 使用Dotall模式:

    print re.match(r".*^score = 0\.59$.*", "score = 0.65\nscore = 0.59\nscore = 1.0",
        re.MULTILINE|re.DOTALL)
    
    <_sre.SRE_Match object at 0x7fd2426d0648>
    
        3
  •  1
  •   mportes    6 年前

    你问题的真正答案是你只会困惑 match search :

    >>> import os, re
    >>> print(re.match(r".*^score = 0\.59$.*", "score = 0.65\nscore = 0.59\nscore = 1.0", flags=re.MULTILINE))
    None
    >>> print(re.search(r".*^score = 0\.59$.*", "score = 0.65\nscore = 0.59\nscore = 1.0", flags=re.MULTILINE))
    <_sre.SRE_Match object; span=(13, 25), match='score = 0.59'>
    >>> 
    

    这就是为什么你的一个非原始例子起作用,而另一个没有。