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 :
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!