регулярное выражение python с просмотром назад

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

С предложенными решениями я играю в 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**')]


person JFerro    schedule 08.01.2019    source источник


Ответы (1)


Ваше регулярное выражение также должно иметь 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+.

person anubhava    schedule 08.01.2019
comment
странно тогда, что regex101 ловит правильный результат. Но ваше решение прекрасно работает. - person JFerro; 08.01.2019
comment
И опять же, это работает математически, чем больше я пытаюсь сформулировать свой вопрос, тем чаще получается минус 1 :-( - person JFerro; 08.01.2019