web-dev-qa-db-fra.com

Capturer un groupe avec findall?

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.

47
Pablo

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.

51
Eli Bendersky

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')]
19
bluepnume

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
>>>
1
Tim Pietzcker
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 '''

0
Mona Jalal