2015-12-07 4 views
1

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

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

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

+0

Красивая! Он работает:) Я не уверен, полностью ли я это понимаю: конечный якорь '$' должен находиться внутри lookahead, но затем, кроме внешнего вида, я должен включать какой-то шаблон, потому что иначе он ничего не будет соответствовать? – fedorqui

+1

В этом «r»^(?! \ W + - \ s +. + $). + "' Мы не повторяем конец якоря. Но когда у вас есть '^ (?! \ W + - \ s + [^ \ n] +) $, это означает, что после начала утверждать, что строка в RHS не соответствует' \ w + - \ s + [^ \ n] + 'pattern , Помните, что lookahead - это просто утверждение, поэтому внутренний указатель все еще находится в начале, а затем вы сопоставляете '$', так что по существу вы, regex, будете только соответствовать '^ $' – anubhava

+1

. Я сделаю несколько небольших тестов, чтобы полностью его понять. Как всегда, большое спасибо! Принято и умственно повторено:) – fedorqui

Смежные вопросы