繁体   English   中英

如何在多行字符串中匹配行的开头和结尾

[英]How to match line beginning and end in a multi-line string

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

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)
>>> 

我想我错过了一些相当简单的东西,但无法弄明白。

问题是因为你正在为你的字符串使用原始字符串,所以\\n被视为...... well \\ then n 正则表达式将理解模式中的 \\n ,但不会理解输入字符串中的\\n

此外,即使不重要,也总是使用flags= keyword,因为一些正则表达式函数具有额外的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正则表达式中所述,匹配多行的模式..为什么这不起作用? 我如何在正则表达式中的多行中匹配任何字符?如果不是这样的话,这可能是重复的原始字符串位)

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

您需要匹配非原始字符串使用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>

你的问题的真正答案是你只混淆matchsearch

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM