Comment puis-je accéder aux groupes capturés si je fais findall(r'regex(with)capturing.goes.here')
? ?__. Je sais que je peux le faire via finditer
, mais je ne souhaite pas effectuer une itération.
findall
renvoie simplement les groupes capturés:
>>> re.findall('abc(de)fg(123)', 'abcdefg123 and again abcdefg123')
[('de', '123'), ('de', '123')]
Extrait de doc pertinent:
Renvoie toutes les correspondances sans chevauchement de motif en chaîne, sous forme de liste de des cordes. La chaîne est numérisée de gauche à droite et les correspondances sont retourné dans l'ordre trouvé. Si un ou plus de groupes sont présents dans le modèle, retourne une liste de groupes; ce sera une liste de tuples si le motif a plus d'un groupe. Vide les matchs sont inclus dans le résultat à moins qu’ils ne touchent le début de un autre match.
Utilisez les groupes librement. Les matchs seront retournés sous forme de liste de groupes de tuples:
>>> re.findall('(1(23))45', '12345')
[('123', '23')]
Si vous souhaitez inclure la correspondance complète, insérez simplement l'intégralité de l'expression rationnelle dans un groupe:
>>> re.findall('(1(23)45)', '12345')
[('12345', '23')]
Plusieurs manières sont possibles:
>>> 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
>>>
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)
résultats
[('Perotto', 'Pier Giorgio')]
re.M
serait logique si votre chaîne est multiligne. De plus, vous avez besoin du mode VERBOSE
(égal à re.X
) dans l'expression régulière que j'ai écrite car il utilise '''