Как найти строки, которые не соответствуют шаблону в многострочном блоке?

Я ищу способ определить, содержит ли многострочный блок текста строку, не соответствующую формату 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 ответ

Решение

Ваш отрицательный взгляд должен иметь конечную привязку $ и за пределами Lookahead вы должны иметь соответствующий шаблон до $:

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]+)$ будет соответствовать только пустой строке, так как она будет соответствовать конечной привязке $ после начала якоря ^ (средняя часть смотрит в будущее).

Другие вопросы по тегам