Comment puis-je trouver toutes les correspondances avec une expression régulière en Python?

312

Dans un programme que j'écris, Python utilise la re.search()fonction pour trouver des correspondances dans un bloc de texte et imprimer les résultats. Toutefois, le programme se ferme une fois qu'il trouve la première correspondance dans le bloc de texte.

Comment faire cela à plusieurs reprises lorsque le programme ne s'arrête pas jusqu'à ce que TOUTES les correspondances aient été trouvées? Existe-t-il une fonction distincte pour ce faire?

kjakeb
la source
Les RE récursifs sont une bête différente. Vous souhaitez répéter la recherche.
2011 à

Réponses:

546

Utilisez re.findallou à la re.finditerplace.

re.findall(pattern, string) renvoie une liste de chaînes correspondantes.

re.finditer(pattern, string)renvoie un itérateur sur les MatchObjectobjets.

Exemple:

re.findall( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')
# Output: ['cats', 'dogs']

[x.group() for x in re.finditer( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')]
# Output: ['all cats are', 'all dogs are']
ambre
la source
18
finditerétait ce que je cherchais. Je suis surpris que l'un renvoie des objets Match et les autres chaînes. Je m'attendais à utiliser une fonction match_allou match_iter.
dsclose
21
AVERTISSEMENT: ceux-ci ne trouveront que des matchs qui ne se chevauchent pas
Antoine Lizée
3
@ AntoineLizée, comment trouver des itérations AVEC chevauchement?
Raksha
16
@Raksha - Utilisation re.searchen boucle. Cela retournera un Matchobjet. Vous voudrez passer Match.start() + 1comme posargument re.searchpour la prochaine itération de la boucle.
ArtOfWarfare
3
Si la correspondance contient plusieurs groupes, findallrenvoie une liste de tuples correspondants, pas une liste de chaînes correspondantes.
rodorgas