Regex для "двойного счета" символов - PullRequest
1 голос
/ 11 апреля 2020

Учитывая строку, состоящую из 0, 1 и 2, такую ​​как '0010201': я хотел бы вывод, который был бы любым рядом, который окружен любым числом (включая ноль) из 0. В этом случае желаемый результат будет ['0010', '01']. Теперь код re.findall("0*10*", "0010201") будет правильно работать на этом входе. Однако, учитывая часть строки, которая имеет форму, подобную 1001 (две из них разделены только нулями), это регулярное выражение вернет ['100', '1'], когда я хотел бы, чтобы оно вернуло ['100', '001'], что "удвоит счет" два средних 0. Как я могу это сделать?

1 Ответ

3 голосов
/ 11 апреля 2020

Вам необходимо регулярное выражение, совпадающее с перекрывающимися совпадениями, но вам нужно указать пользовательскую левую границу: для этого необходимо указать не 0 символ или начало строки.

Вы можете использовать

re.findall(r"(?=(?<!0)(0*10*))", text)

Подробности

  • (?= - начало положительного прогноза, который позволяет перекрывать совпадения:
    • (?<!0) - отрицательный взгляд за этим не удается выполнить сопоставление, если непосредственно слева от текущего местоположения имеется 0
    • (0*10*) - Группа захвата 1 (возвращаемое значение для re.findall): ноль или более 0 символов , 1 и затем снова ноль или более 0 символов
  • ) - конец заглядывания.

См. Python демо :

import re
rx = r"(?=(?<!0)(0*10*))"
print(re.findall(rx, "0010201")) # => ['0010', '01']
print(re.findall(rx, "1001"))    # => ['100', '001']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...