регулярное выражение Python

1

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

С предложенными решениями я играю в 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 с этим по-видимому хорошим результатом:

Изображение 174551

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

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

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

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

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

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

Теги:
lookahead
lookbehind

1 ответ

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+.

  • 1
    странно то, что regex101 ловит правильный результат. Но ваше решение работает чудесно.
  • 0
    И снова, это работает математически, чем больше я пытаюсь сформулировать свой вопрос, тем чаще это случается, я получаю минус 1 :-(

Ещё вопросы

Сообщество Overcoder
Наверх
Меню