regex - соответствует последней группе вхождений - PullRequest
0 голосов
/ 18 июня 2020

Пример строки: '100 foo 100 bar asdfasdf asdfasdf frqf 200 foo 200 bar asdfsd FOOBAR'

Я хочу сопоставить последнее появление цифр, за которыми следует foo, и digits, за которыми следует bar, которые предшествуют FOOBAR

Ожидается: [200, 200]

Текущий выход: [100, 100]

вот что у меня:

r'(\d+.?\d+)\s*foo.*?(\d+.?\d+).*bar(?:.|\n)*(?:FOOBAR)\s?(\d+.?\d+).*?'

1 Ответ

0 голосов
/ 18 июня 2020

Если используемый вами язык поддерживает отрицательный просмотр вперед, вам следует попробовать-

(\d+) foo (\d+) bar(?:(?!(\d+) foo (\d+) bar).)*?FOOBAR

Посмотрите демонстрацию здесь

Объяснение: -

  • Сначала мы проверяем наличие группы digits foo digits bar, используя (\d+) foo (\d+) bar

  • Теперь мы убеждаемся, что нет другого появления digits foo digits bar anything сразу после использования отрицательного просмотра вперед - (?!(\d+) foo (\d+) bar).

    Теперь мы оборачиваем это внутри группы без захвата и выполняем ленивый квантификатор для нее.

  • Наконец, отметьте для FOOBAR в конце

По сути, это гарантирует, что группы di git захвачены здесь -

(\d+) foo (\d+) bar

* За 1038 * не следует любой другой digits foo digits bar до достижения FOOBAR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...