Maison >développement back-end >Tutoriel Python >Pourquoi « re.findall() » ne renvoie-t-il pas les correspondances Regex qui se chevauchent et comment puis-je y remédier ?

Pourquoi « re.findall() » ne renvoie-t-il pas les correspondances Regex qui se chevauchent et comment puis-je y remédier ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-06 10:23:12408parcourir

Why Doesn't `re.findall()` Return Overlapping Regex Matches, and How Can I Fix It?

Approfondir les correspondances Regex qui se chevauchent

Dans le monde des expressions régulières, comprendre pourquoi certaines correspondances peuvent ne pas être trouvées peut être déroutant. Prenons l'exemple suivant :

match = re.findall(r'\w\w', 'hello')
print(match)

Comme prévu, cet extrait renvoie une liste contenant « il » et « ll », qui correspondent au modèle de séquences de deux lettres. Cependant, on pourrait se demander pourquoi 'el' et 'lo', qui semblent également correspondre au modèle, ne sont pas inclus dans le résultat.

Ce comportement découle du comportement par défaut de la fonction re.findall, qui ne produit pas de correspondances qui se chevauchent. En d'autres termes, il se déplace le long de la chaîne, ne trouvant que la première correspondance pour un modèle donné et ne prenant en compte aucun chevauchement potentiel.

Pour résoudre ce problème, il existe une solution de contournement intelligente impliquant des assertions anticipées. Une assertion anticipée (?=...) correspond à un modèle sans réellement consommer aucune partie de la chaîne. Cela nous permet de trouver toutes les correspondances qui se chevauchent et qui satisfont au modèle donné.

Par exemple, pour trouver toutes les séquences de deux lettres dans la chaîne « bonjour » à l'aide d'une assertion anticipée, l'expression suivante peut être utilisée :

re.findall(r'(?=(\w\w))', 'hello')

Cette expression renverra une liste contenant ['he', 'el', 'll', 'lo'], car chaque séquence de deux lettres est mise en correspondance avec succès sans chevauchement.

Comprendre les assertions anticipées et leurs applications pratiques peut grandement améliorer l'efficacité des expressions régulières pour des scénarios de correspondance complexes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn