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