Подтвердить что ты не робот

Как найти совпадающие совпадения с регулярным выражением?

>>> match = re.findall(r'\w\w', 'hello')
>>> print match
['he', 'll']

Так как \w\w означает два символа, 'he' и 'll' ожидаются. Но почему 'el' и 'lo' не соответствуют регулярному выражению?

>>> match1 = re.findall(r'el', 'hello')
>>> print match1
['el']
>>>
4b9b3361

Ответ 1

findall не дает совпадающих совпадений по умолчанию. Однако это выражение:

>>> re.findall(r'(?=(\w\w))', 'hello')
['he', 'el', 'll', 'lo']

Здесь (?=...) является утверждение look :

(?=...) соответствует, если ... соответствует следующему, но не использует ни один из строка. Это называется ожидаемым утверждением. Например, Isaac (?=Asimov) будет соответствовать 'Isaac ', только если его следует 'Asimov'.

Ответ 3

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

Существует несколько утверждений с нулевой длиной (например, ^ (начало ввода/строки), $ (конец ввода/строка), \b (граница слова)), но look-arounds ((?<=) положительный внешний вид и (?=) позитивный внешний вид) - это единственный способ захватить перекрывающий текст с входа. Отрицательные взгляды ((?<!) отрицательный внешний вид, (?!) негативный взгляд вперед) здесь не очень полезны: если они утверждают, что истина, то захват внутри потерпел неудачу; если они утверждают false, то совпадение не выполняется. Эти утверждения являются нулевой длиной (как упоминалось ранее), что означает, что они будут утверждать, не потребляя символы во входной строке. Они будут фактически соответствовать пустой строке, если утверждение прошло.

Применяя приведенное выше знание, регулярное выражение, которое работает для вашего случая, будет выглядеть следующим образом:

(?=(\w\w))

Ответ 4

Я не эксперт по регулярным выражениям, но я хотел бы ответить на мой похожий вопрос.

Если вы хотите использовать группу захвата с предвидением:

Пример регулярного выражения: (\ d) (? =.\1)

строка: 5252

это будет соответствовать первым 5, а также первым 2

(\ D) - создать группу захвата, (? =\D\1) - сопоставить любую цифру, за которой следует группа 1 захвата, без использования строки, что позволяет перекрывать друг друга