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?


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']

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.