Как использовать {} в шаблоне регулярного выражения с findall + Python

Я создаю регулярное выражение, как показано ниже:

import re
asd = re.compile(r"(blah){2}")
mo = asd.search("blahblahblahblahblahblah ll2l 21HeHeHeHeHeHe lllo")
mo1 = asd.findall("blahblahblahblahblahblah")
print(mo.group())
print("findall output: ", mo1)

Это возвращает вывод blahblah findall output: ['blah', 'blah', 'blah']

-Почему вывод findall трижды соответствует слову "blah", если в шаблоне указано {2} раза?

Если я перейду на {4}, то найду все совпадения:

asd = re.compile(r"(blah){4}")
findall output:  ['blah']

-Как {m} обрабатывается с помощью re.search и re.findall ?

Большое спасибо.


person Sushil Jain    schedule 18.12.2016    source источник
comment
blahblah, blahblah и blahblah. Три матча. Каждый захватывает blah.   -  person Ry-♦    schedule 18.12.2016
comment
Я полагаю, вы хотите, чтобы механизм регулярных выражений тоже возвращал только два значения, верно? Тогда вам не нужен ограничивающий квантификатор: получите результаты с помощью re.findall и получите необходимые элементы, используя их индексы.   -  person Wiktor Stribiżew    schedule 18.12.2016


Ответы (2)


Если вы хотите поймать (blah){2} (те 2 blah, которые у вас есть), вы должны обернуть его:

asd = re.compile(r"((?:blah){2})")

Обратите внимание, что я старался не зацепить внутреннюю часть blah (используя ?:)

>>>asd = re.compile(r"((?:blah){2})")
>>>mo = asd.search("blahblahblahblahblahblah ll2l 21HeHeHeHeHeHe lllo")
>>>mo1 = asd.findall("blahblahblahblahblahblah")
>>>print(mo.group())
blahblah
>>>print("findall output: ", mo1)
findall output:  ['blahblah', 'blahblah', 'blahblah']

Точно то же самое происходит с {4}, который у вас есть. regex найдет, но не поймает. если вы хотите поймать его, вы должны обернуть его.

person Dekel    schedule 18.12.2016

(blah){2} захватывает и исчерпывает строку blahblah, но возвращает только последний blah в blahblah. Поскольку у вас есть три blahblah в вашей строке, она выведет ['blah', 'blah', 'blah']

(blah){4} может совпасть только один раз, поэтому вы получите ['blah']

person ryugie    schedule 18.12.2016