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

How to find lines that do not match pattern in a multiline block?

我正在寻找一种方法来确定多行文本块是否包含与格式不匹配的任何行 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))

也就是returns:

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

但是,在此条件下使用否定前瞻并不匹配任何内容。即下面的returns一个空列表[]而不是['hello bye']

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

我在这里错过了什么?

你的负面前瞻需要有结束锚 $ 并且在前瞻之外你应该在 $:

之前有匹配的模式
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]+)$ 将只匹配一个 空行 因为它将在开始锚点 ^ 之后匹配结束锚点 $ (中间部分是前瞻性的) ).