Maison > développement back-end > Tutoriel Python > Pourquoi « re.findall » renvoie-t-il une liste vide alors que « re.search » fonctionne correctement avec le même modèle et la même chaîne dans Python 3.4.3 ?

Pourquoi « re.findall » renvoie-t-il une liste vide alors que « re.search » fonctionne correctement avec le même modèle et la même chaîne dans Python 3.4.3 ?

Patricia Arquette
Libérer: 2024-12-22 20:57:10
original
293 Les gens l'ont consulté

Why Does `re.findall` Return an Empty List While `re.search` Works Correctly with the Same Pattern and String in Python 3.4.3?

re.findall se comporte de manière anormale

Dilemme :

Dans un script Python utilisant Python 3.4 .3, la méthode re.search fournit le résultat attendu lorsqu'elle est appliquée à un chaîne source particulière en utilisant un modèle spécifié. Cependant, re.findall renvoie inexplicablement une liste vide pour le même modèle et la même chaîne source.

Exploration :

Curieusement, le La méthode re.findall se comporte de manière inattendue même si elle semble remplir les conditions d'extraction des correspondances d'une chaîne basée sur un motif.

Résolution :

Après un examen attentif, il devient évident que deux facteurs contribuent à ce comportement particulier :

  • Composition du motif :
    Le modèle fourni contient une expression controversée, r'.', qui vise à faire correspondre un caractère d'échappement () suivi de tout caractère autre qu'une nouvelle ligne. Cependant, dans le contexte d'un littéral de chaîne r'', cette expression tente de correspondre à un littéral , ce qui entraîne un comportement incorrect.
  • findall Behavior:
    Le re. La méthode findall s'attend à ce que le modèle contienne des groupes de capture. Si aucun groupe de capture n'est présent, il renvoie des chaînes vides. Le modèle d'origine manque de groupes de capture, ce qui le rend incapable de capturer les correspondances souhaitées.

Modèle rectifié :

Pour atténuer ce problème et extraire avec succès les correspondances, le Le modèle rectifié suivant doit être employé :

-?\d*\.?\d+
Copier après la connexion

Explication :

  • -?:Signe moins facultatif
  • d * : Facultatif chiffres
  • .?: Séparateur décimal optionnel
  • d : Un ou plusieurs chiffres

Démonstration :

En utilisant le modèle modifié, le La méthode re.findall récupère désormais avec précision la liste anticipée des correspondances :

['123', '3.1415926']
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal