Maison >développement back-end >Tutoriel Python >Comment puis-je trouver des correspondances qui se chevauchent à l'aide de « re.findall() » de Python ?

Comment puis-je trouver des correspondances qui se chevauchent à l'aide de « re.findall() » de Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-06 16:40:13648parcourir

How Can I Find Overlapping Matches Using Python's `re.findall()`?

Comprendre les correspondances qui se chevauchent dans Regex

Par défaut, la méthode findall() du module re de Python ne capture pas les correspondances qui se chevauchent dans une chaîne . Ce comportement peut prêter à confusion, en particulier lorsque les correspondances sont constituées de caractères consécutifs.

Considérez le code suivant :

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

Sortie :

['he', 'll']

Ce modèle correspond à deux caractères consécutifs. caractères de mot (w). Comme prévu, lui et nous reviendrons. Cependant, el et lo ne sont pas capturés, bien qu'ils apparaissent dans la chaîne.

Surmonter les correspondances qui se chevauchent

Pour capturer les correspondances qui se chevauchent, nous pouvons utiliser une assertion anticipée (?= ...). Cette assertion correspond à un modèle spécifique mais ne consomme aucun caractère de la chaîne. Au lieu de cela, il vérifie si les caractères suivants correspondent à l'assertion.

Par exemple :

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

Sortie :

['he', 'el', 'll', 'lo']

Dans ce cas, (?=(ww )) correspond à n'importe quel emplacement où existent deux caractères de mots consécutifs sans les consommer réellement. Cela permet à findall() de renvoyer à la fois des correspondances qui se chevauchent et qui ne se chevauchent pas.

Explication

L'expression régulière /(?=(ww)) peut être décomposée comme suit :

  • (?:...) est un groupe non capturant, ce qui signifie que le contenu du groupe n'est pas renvoyé.
  • ww correspond à deux caractères de mot consécutifs.
  • (?=...) est l'assertion d'anticipation, qui garantit que la chaîne contient ww à l'emplacement actuel mais ne les consomme pas.

En utilisant cette approche, nous pouvons détecter efficacement toutes les correspondances qui se chevauchent au sein d'une chaîne, même lorsqu'elles sont constituées de caractères consécutifs.

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