2012-05-17 2 views
0

касательно последующего У меня есть строка синтаксически разобранного текста:Python регулярное выражение, два негативных высказываний

s = 'ROOT (S (VP (VP (VB the) (SBAR (S (NP (DT same) (NN lecturer)) (VP (VBZ says)' 

я хотел бы, чтобы соответствовать «то же» в с. Это ключ, что «» и «же» соответствует только при разделенных синтаксической разметки (т.е. (НП, S и т.д.) Таким образом, «то же» НЕ должен найти матч в s2:.

s2= 'ROOT (S (VP (VP (VB the) (SBAR (S (NP (DT lecturer) (NN same)) (VP (VBZ says)' 

Я попытался двойной отрицательный опережения утверждение не дало никаких результатов:

>>>rx = r'the(?![a-z]*)same(?![a-z]*)' 
>>>re.findall(rx,s) 
[] 

идея заключается в том, чтобы match'the», когда не следует строчными буквами, а затем матч„же“, когда не следует строчными буквами

.

У кого-нибудь есть лучший подход?

+1

Регулярные выражения не являются хорошими при анализе вложенных структур. Этого может быть достаточно для вашего конкретного примера, поскольку вы, похоже, не заботитесь о гнездовании. –

+0

Правильно, вложенная структура не является проблемой. Эта же проблема возникает при попытке сопоставить «то же самое» с строкой «theABCD123sameEFG456» – Renklauf

ответ

1

Так что вы хотите, чтобы соответствовать, если все символы между the и same не строчные буквы, вот как вы можете написать, что в регулярных выражениях:

the[^a-z]*same 

Обратите внимание, что вы можете добавить границы слов, а также, так что вы не соответствуют что-то вроде foothe ... samebar, что будет выглядеть следующим образом:

\bthe\b[^a-z]*\bsame\b 
+0

Это сделало это. Я на самом деле пытался попробовать что-то в этом роде, но, должно быть, я кое-что что-то притворил. В любом случае, спасибо! – Renklauf