Я ищу способ определить, содержит ли многострочный блок текста любую строку, не соответствующую формату 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)
Что я здесь отсутствует?
Красивая! Он работает:) Я не уверен, полностью ли я это понимаю: конечный якорь '$' должен находиться внутри lookahead, но затем, кроме внешнего вида, я должен включать какой-то шаблон, потому что иначе он ничего не будет соответствовать? – fedorqui
В этом «r»^(?! \ W + - \ s +. + $). + "' Мы не повторяем конец якоря. Но когда у вас есть '^ (?! \ W + - \ s + [^ \ n] +) $, это означает, что после начала утверждать, что строка в RHS не соответствует' \ w + - \ s + [^ \ n] + 'pattern , Помните, что lookahead - это просто утверждение, поэтому внутренний указатель все еще находится в начале, а затем вы сопоставляете '$', так что по существу вы, regex, будете только соответствовать '^ $' – anubhava
. Я сделаю несколько небольших тестов, чтобы полностью его понять. Как всегда, большое спасибо! Принято и умственно повторено:) – fedorqui