Мы можем обобщить решение для любого регулярного выражения.
Допустим, у нас есть действительное регулярное выражение pattern
, в котором вы хотите искать совпадающие совпадения.
Чтобы получить совпадающие совпадения, нам нужно избегать потребления символов в каждом совпадении, полагаясь на механизм выталкивания для оценки регулярного выражения в каждой позиции строки. Это может быть достигнуто путем окружения всего регулярного выражения в прогнозе (?=<pattern>)
, и мы можем вложить группу захвата, чтобы захватить совпадение (?=(<pattern>))
.
Этот метод работает для Python * Двигатель 1011 *, поскольку после того, как он обнаружил пустое совпадение, он просто столкнется и не будет повторно оценивать регулярное выражение в той же позиции, но будет искать непустое совпадение во второй попытке, как и механизм PCRE.
Пример кода:
import re
inp = '10.5.20.52.48.10'
matches = [m[0] if type(m) is tuple else m for m in re.findall(r'(?=(\d+(\.\d+){2}))', inp)]
Вывод:
['10.5.20', '0.5.20', '5.20.52', '20.52.48', '0.52.48', '52.48.10', '2.48.10']
Если исходный pattern
не имеет нумерованных обратных ссылок, то мы можем построить перекрывающуюся версию регулярного выражения со строкой конкатенация.
Однако, если это так, регулярное выражение нужно будет изменить вручную, чтобы исправить обратные ссылки, которые были смещены дополнительной группой захвата.
Обратите внимание, что этот метод не даст вам совпадающие совпадения, начинающиеся с того же индекса (например, поиск a+
в aaa
даст вам 3 совпадения вместо 6 совпадений). Невозможно реализовать совпадение совпадений, начинающееся с того же индекса в большинстве разновидностей / библиотек регулярных выражений, за исключением Perl.