Python - re.findall возвращает нежелательный результат

re.findall("(100|[0-9][0-9]|[0-9])%", "89%")

Это возвращает только результат [89], и мне нужно вернуть все 89%. Есть идеи, как это сделать?


person Jakub Turcovsky    schedule 16.04.2013    source источник
comment
Сделайте из него строку; "89%"   -  person    schedule 16.04.2013


Ответы (3)


Тривиальное решение:

>>> re.findall("(100%|[0-9][0-9]%|[0-9]%)","89%")
['89%']

Более красивое решение:

>>> re.findall("(100%|[0-9]{1,2}%)","89%")
['89%']

Самое красивое решение:

>>> re.findall("(?:100|[0-9]{1,2})%","89%")
['89%']
person 0x90    schedule 16.04.2013

>>> re.findall("(?:100|[0-9][0-9]|[0-9])%", "89%")
['89%']

При наличии групп захвата findall возвращает только захваченные части. Используйте ?:, чтобы круглые скобки не были группой захвата.

person John Kugelman    schedule 16.04.2013
comment
Изменит ли изменение 100|[0-9][0-9]|[0-9] на \d{1,3} назначение шаблона? - person Bryan; 17.04.2013

Используйте внешнюю группу, а внутреннюю группу не захватывающую:

>>> re.findall("((?:100|[0-9][0-9]|[0-9])%)","89%")
['89%']
person Community    schedule 16.04.2013