регулярное выражение Python - PullRequest
0 голосов
/ 08 января 2019

Несколько дней назад я опубликовал вопрос о том, как поймать слова в тексте, предшествующем определенному совпадению с регулярным выражением. введите описание ссылки здесь

С предложенными решениями я играю в regex101, пытаясь найти слова, которые следуют за совпадением.

Это код:

content="""Lorem ipsum dolor sit amet (12,16) , consectetur 23 adipiscing elit. Curabitur (45) euismod scelerisque consectetur. Vivamus aliquam velit (46,48,49) at augue faucibus, id eleifend purus (34) egestas. Aliquam vitae mauris cursus, facilisis enim (23) condimentum, vestibulum enim. """

print(content)
pattern =re.compile(r"((?:\w+ ?){1,5}(?=\(\d))(\([\d]+\))(?: )(?:\w+ ?){1,5}")
matches = pattern.findall(content)
print('the matches are:')
print(matches)

регулярное выражение работает и ловит числа между круглыми скобками.

это объяснение регулярного выражения

((?:\w+ ?){1,5}(?=\(\d))(\([\d]+\))(?: )(?:\w+ ?){1,5}
________________________***********++++++++++++++

____ = это взгляд позади. Ищет от 1 до 5 слов перед матчем, чтобы найти открытое (

**** = фактическое регулярное выражение ===> числа в скобках

++++ = Это та часть, которую я притворяюсь использовать, чтобы ловить слова ПОСЛЕ регулярного выражения.

Я попробовал это в regex101 с этим, по-видимому, хорошим результатом:

enter image description here

Но результат кода следующий:

[('Curabitur ', '(45)'), ('id eleifend purus ', '(34)'), ('facilisis enim ', '(23)')]

Как вы видите, список включает в себя кортежи с первыми предыдущими словами, а затем само совпадение, НО НЕ СЛЕДУЮЩИХ СЛОВ.

Где подвох ????

Мой ожидаемый результат будет:

matches=[('Curabitur ', '(45)', '**euismod scelerisque consectetur**'), ('id eleifend purus ', '(34)', '**egestas**'), ('facilisis enim ', '(23)', '**condimentum**')]

1 Ответ

0 голосов
/ 08 января 2019

Ваше регулярное выражение также должно иметь третью группу захвата, чтобы быть возвращенным findall:

>>> print re.findall(r"((?:\w+ ?){1,5}(?=\(\d))(\(\d+\))(?: )((?:\w+ ?){1,5})", content)
[('Curabitur ', '(45)', 'euismod scelerisque consectetur'), ('id eleifend purus ', '(34)', 'egestas'), ('facilisis enim ', '(23)', 'condimentum')]

Примечание ((?:\w+ ?){1,5}) как 3-я группа захвата.

Также обратите внимание, что [\d]+ эквивалентно \d+.

...