如何在多行程序段中查找与模式不匹配的行?

时间:2015-12-07 16:23:59

标签: python regex multiline negative-lookahead

我正在寻找一种方法来确定多行文本块是否包含任何与格式text- more text不匹配的行。

所以给出了这个文字:

hello- 12345
hello bye
bye- 123

它应与hello bye匹配。

如果我尝试匹配那些与此模式匹配的行,我会得到第1行和第3行:

import re

text = """hello- 12345
hello bye
bye- 123"""

for m in re.finditer(r"^\w+-\s+[^\n]+$", text, re.MULTILINE):
    print '%02d-%02d: %s' % (m.start(), m.end(), m.group(0))

即返回:

00-12: hello- 12345
23-31: bye- 123

但是,在这种情况下使用负向前瞻与任何事情都不匹配。也就是说,以下内容返回空列表[]而不是['hello bye']

print re.findall(r"^(?!\w+-\s+[^\n]+)$", text, re.MULTILINE)

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

您的否定前瞻需要有结束锚$,在前瞻之外,您应该在$之前找到匹配的模式:

print re.findall(r"^(?!\w+-\s+[^\n]+$).+$", text, re.MULTILINE)
['hello bye']

或者简化:

print re.findall(r"^(?!\w+-\s+.+$).+", text, re.MULTILINE)
['hello bye']

^(?!\w+-\s+[^\n]+)$只匹配空行,因为它会在开始锚$之后匹配结束锚^(中间部分是预见)。