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

Захват группы с помощью findall?

Как я могу получить доступ к захваченным группам, если я делаю findall(r'regex(with)capturing.goes.here')? Я знаю, что могу сделать это через finditer, но я не хочу итерации.

4b9b3361

Ответ 1

findall просто возвращает захваченные группы:

>>> re.findall('abc(de)fg(123)', 'abcdefg123 and again abcdefg123')
[('de', '123'), ('de', '123')]

Соответствующая выдержка из документа:

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

Ответ 2

Используйте группы свободно. Матчи будут возвращены в виде списка кортежей:

>>> re.findall('(1(23))45', '12345')
[('123', '23')]

Если вы хотите, чтобы полное совпадение было включено, просто вложите все регулярное выражение в группу:

>>> re.findall('(1(23)45)', '12345')
[('12345', '23')]

Ответ 3

Возможны несколько способов:

>>> import re
>>> r = re.compile(r"'(\d+)'")
>>> result = r.findall("'1', '2', '345'")
>>> result
['1', '2', '345']
>>> result[0]
'1'
>>> for item in result:
...     print(item)
...
1
2
345
>>>

Ответ 4

import re
string = 'Perotto, Pier Giorgio'
names = re.findall(r'''
                 (?P<first>[-\w ]+),\s #first name
                 (?P<last> [-\w ]+) #last name
                 ''',string, re.X|re.M)

print(names)

возвращает

[('Perotto', 'Pier Giorgio')]

re.M имеет смысл, если ваша строка является многострочной. Также вам нужен VERBOSE (равный re.X) режим в регулярном выражении, который я написал, потому что он использует '''