Несколько дней назад я отправил вопрос о том, как поймать слова в тексте, предшествующем определенному совпадению с регулярным выражением. введите описание ссылки здесь
С предложенными решениями я играю в 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 с этим по-видимому хорошим результатом:
Но результат кода следующий:
[('Curabitur ', '(45)'), ('id eleifend purus ', '(34)'), ('facilisis enim ', '(23)')]
Как вы видите, список включает в себя кортежи с первыми предыдущими словами, а затем с самим соответствием, НО НЕ СЛЕДУЮЩИМИ СЛОВАМИ.
Где подвох????
Мой ожидаемый результат будет:
matches=[('Curabitur ', '(45)', '**euismod scelerisque consectetur**'), ('id eleifend purus ', '(34)', '**egestas**'), ('facilisis enim ', '(23)', '**condimentum**')]
У вашего регулярного выражения также должна быть 3-я группа захвата, чтобы его мог найти 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+
.