Почему это регулярное выражение возвращает неожиданный результат? - PullRequest
0 голосов
/ 23 февраля 2019
txt = "r/1 /r/2 er/3"
x = re.findall("(?!e)r\/[0-9]", txt)

Приведенный выше код соответствует r/1, r/2, r/3 (то есть всему)

, а изменение на ?=e не соответствует ничему

Isn 't первый код должен соответствовать только r/1 and r/2, так как я в основном говорю "шаблон сопоставления r/digit, но только если ему не предшествует e"

1 Ответ

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

(?!e) - это отрицательный взгляд впереди , который не соответствует совпадению, если непосредственно справа от текущего местоположения его шаблон находит совпадение.Таким образом, (?!e)r всегда совпадает, потому что r не является e, а (?!e)r\/[0-9] = r\/[0-9] (т. Е. Предварительный просмотр избыточен, поскольку не влияет на процесс сопоставления).

Вы хотите Отрицательный взгляд за спиной , (?<!e):

(?<!e)r/[0-9]+

См. Демонстрационную версию regex .Я также советую количественно определить шаблон [0-9], чтобы он соответствовал 1 или более цифрам.

Подробности

  • (?<!e) - отрицательный взгляд сзади, который гарантирует, что тамнет e непосредственно слева от текущего местоположения
  • r/ - подстрока r/
  • [0-9]+ - 1+ цифр.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...