Как я могу получить доступ к захваченным группам, если я делаю findall(r'regex(with)capturing.goes.here')
?
Я знаю, что могу сделать это через finditer
, но я не хочу итерации.
Захват группы с помощью findall?
Ответ 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
) режим в регулярном выражении, который я написал, потому что он использует '''