2013-09-24 3 views
3

За последние несколько часов я пытался соответствовать адреса (ов) из следующих образцов данных, и я не могу заставить его работать:Regex с отрицательным предпросмотром через несколько строк

medicalHistory  None 
address    24 Lewin Street, KUBURA, 
       NSW, Australia 
email    [email protected] 


address    16 Yarra Street, 
            LAWRENCE, VIC, Australia 
name    Mary Beor 
medicalHistory  None 
phone    00000000000000000000353336907 
birthday   26-11-1972 

Моего плана было найти что-либо, начинающееся с «адреса», за которым следует любое пробел, за которым следуют символы, запятые и символы новой строки и заканчивается символом новой строки, за которым следует символ. Я придумал следующее (и множество вариаций этого):

address\s+([0-9a-zA-Z, \n\t]+)(?!\n\w) 

К сожалению, совпадающим следующее:

address    24 Lewin Street, KUBURA, 
       NSW, Australia 
email    MaryBeor 

и

address    16 Yarra Street, 
           LAWRENCE, VIC, Australia 
name    Mary Beor 
medicalHistory  None 
phone    00000000000000000000353336907 
birthday   26 

вместо

address    24 Lewin Street, KUBURA, 
       NSW, Australia 

и

address    16 Yarra Street, 
           LAWRENCE, VIC, Australia 

Не могли бы вы рассказать мне, что я делаю неправильно?

ответ

3

Я хотел бы сделать это следующим образом:

address\s+((?![\r\n]+\w)[0-9a-zA-Z, \r\n\t])+ 

here on Regexr увидеть его.

Эта ((?![\r\n]+\w)[0-9a-zA-Z, \r\n\t])+ является важной частью, где я говорю, соответствует следующему символу от [0-9a-zA-Z, \r\n\t], если (?![\r\n]+\w) не следует. Это соответствует тому, что вы ожидаете.

В обоих случаях регулярное выражение перестало соответствовать из-за символа, который не включен в ваш класс символов. Если вы хотите идти по этому пути, чем вам нужно будет сочетать lazy quantifier и positive lookahead:

address\s+([0-9a-zA-Z, \n\r\t]+?)(?=\r\w) 

[0-9a-zA-Z, \n\r\t]+? сопрягает как можно меньше до состояния (?=\r\w) верно.

Посмотреть here at Regexr

+0

Отлично! Из любопытства, что случилось с моим взглядом? – n1te

+0

@ n1te Возможно, жадный квантификатор '+', который потребляет все до '@' и все еще удовлетворяет негативному ожиданию. –

+0

@RohitJain спасибо за объяснение – n1te

1

Проблемы с регулярным выражением является то, что + жаден и идет до тех пор, пока не найдет персонаж из этой группы, то @ в первом случае и - во втором.

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

re.findall(r'address\s+.*?(?=\n\w)', s, re.DOTALL) 

она дает:

['address    24 Lewin Street, KUBURA, \n    NSW, Australia', 
'address    16 Yarra Street, \n          LAWRENCE, VIC, Australia'] 
+0

Спасибо, это имеет смысл. Я должен запустить ваш код, чтобы лучше понять его. Спасибо за вашу помощь – n1te

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