регулярное выражение Python пытается сопоставить второе вхождение набора слов в строке - PullRequest
0 голосов
/ 02 февраля 2019

у меня есть следующая строка

test 123 Copy complete, now saving to disk (please wait)... Copy complete.test 456 Copy complete, now saving to disk (please wait)... Copy complete. test789

Я пытаюсь найти совпадение с последним / вторым вхождением "сейчас сохраняю на диск"

r'^.*now saving to disk.*(?=now saving to disk).*$'

Я думал, что смогу использовать? =смотрите вперед, чтобы он смотрел вперед на 2-е вхождение, но это, похоже, не работает.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Решение 1:

Чтобы получить последнее вхождение, просто используйте:

^.*(now saving to disk)

Нажмите для демонстрации

Объяснение:

  • ^ - подтверждает начало строки
  • .* - соответствует 0+ вхождений любогосимвол кроме новой строки, как можно больше.Это приведет вас к концу строки
  • (now saving to disk) - соответствует now saving to disk после возврата к последнему вхождению фразы и захватит ее в группе 1

Решение 2:

Чтобы получить второе вхождение, просто возьмите то, что находится в группе 1:

^(?:.*?(now saving to disk)){2}

Нажмите для демонстрации

Объяснение:

  • ^ - подтверждает начало строки
  • (?:.*?(now saving to disk)){2} - соответствует 0+ вхождений любогосимвол, за исключением новой строки, как можно меньше, за которым следует фраза now saving to disk.Это повторяется дважды, чтобы получить необходимую фразу.

Решение 3:

Вот еще одно регулярное выражение, которое использует отрицательный взгляд, чтобы убедиться, чтофраза больше не повторяется до конца строки.Это снова приведет вас к последнему появлению now saving to disk

(now saving to disk)(?!.*\1.*$)

Нажмите для демонстрации

Объяснение:

  • (now saving to disk) - сопоставляет и захватывает now saving to disk в группе 1
  • (?!.*\1.*$) - отрицательный прогноз, чтобы убедиться, что все, что присутствует в группе 1, не будет добавлено позжедо конца строки
0 голосов
/ 02 февраля 2019

Вы можете использовать это регулярное выражение, чтобы пропустить первое вхождение вашего текста и сопоставить второе / последнее вхождение,

^.*(now saving to disk).*$

Демо

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

Кроме того, ваше регулярное выражение ^.*now saving to disk.*(?=now saving to disk).*$ почти правильно, за исключением того, что вы не должны были использовать ?= в своей группе, что фактически делало его прогнозным выражением, а не просто захватывало его в намеченной первой группе.Так что, если вы просто удалите ?= из своего регулярного выражения, даже ваше регулярное выражение будет работать отлично и также будет иметь наилучшую производительность.

Демонстрация для вашего регулярного выражения после удаления ?=

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