Maison >développement back-end >Tutoriel Python >Pourquoi « re.findall » renvoie-t-il une liste vide lors de la correspondance de nombres en Python ?

Pourquoi « re.findall » renvoie-t-il une liste vide lors de la correspondance de nombres en Python ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-27 01:20:10785parcourir

Why Does `re.findall` Return an Empty List When Matching Numbers in Python?

re.findall se comporte de manière incohérente

Lorsqu'ils tentent d'utiliser re.findall pour faire correspondre des valeurs numériques dans une chaîne, certains utilisateurs ont remarqué un comportement inattendu . Alors que re.search récupère avec précision les correspondances, re.findall renvoie une liste vide. Cette disparité apparente peut être attribuée aux facteurs suivants :

Capture des groupes et re.findall

Un point clé à retenir est que re.findall acquiert le texte capturé si le Le modèle regex contient des groupes de capture. Comme défini dans la référence, si un modèle inclut des groupes de capture, re.findall renvoie une liste de groupes, potentiellement sous la forme de tuples pour les modèles comportant plusieurs groupes. Notamment, même les correspondances vides sont incluses dans la sortie, à moins qu'elles ne précèdent immédiatement une autre correspondance.

Groupes sans capture et évasion littérale

Dans l'exemple fourni, le spécifique le problème vient de l'utilisation de \ dans les littéraux de chaîne r''. Cette construction tente de faire correspondre un littéral , plutôt que le sens prévu de faire correspondre un seul caractère (autre qu'une nouvelle ligne). Pour faire correspondre correctement les valeurs numériques, le modèle doit être modifié comme suit :

-?\d*\.?\d+

Ce modèle comprend les groupes de capture suivants :

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

Démonstration

Voici une démonstration IDEONE du patron révisé :

import re
s = r'abc123d, hello 3.1415926, this is my book'
pattern = r'-?\d*\.?\d+'
L = re.findall(pattern, s)
print(L)

Ce modèle récupère correctement la liste attendue des correspondances numériques : ['123', '3.1415926'].

En considérant la nature de la capture des groupes et l'utilisation appropriée de l'échappement littéral, les développeurs peuvent garantir que re.findall fonctionne comme prévu dans leurs scripts.

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