Maison >développement back-end >Tutoriel Python >Pourquoi `re.findall()` renvoie-t-il une liste vide lorsque `re.search()` trouve une correspondance ?

Pourquoi `re.findall()` renvoie-t-il une liste vide lorsque `re.search()` trouve une correspondance ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-19 09:23:09135parcourir

Why Does `re.findall()` Return an Empty List When `re.search()` Finds a Match?

re.findall Behavior

La fonction re.findall() peut prêter à confusion si elle ne renvoie pas les résultats attendus lorsqu'elle correspondant à une chaîne. Explorons les raisons de son comportement dans un cas spécifique.

Énoncé du problème

Considérez la chaîne source suivante :

s = r'abc123d, hello 3.1415926, this is my book'

Et le modèle suivant :

pattern = r'-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+'

Avec re.search, nous obtenons le bon result :

m = re.search(pattern, s)
print(m)  # <_sre.SRE_Match object; span=(3, 6), match='123'>

Cependant, re.findall renvoie une liste vide :

L = re.findall(pattern, s)
print(L)  # []

Comprendre le problème

Il y en a deux aspects clés à considérer :

  1. Capture de correspondance vide Groupes : re.findall renvoie les textes capturés à partir de l'objet de correspondance, mais dans ce modèle, il n'y a pas de groupes de capture. En conséquence, il renvoie des chaînes vides.
  2. Échappement de caractère :Le \. dans le modèle correspond à deux caractères : et à n'importe quel caractère sauf la nouvelle ligne. Ceci n'est pas destiné à faire correspondre des valeurs numériques.

Solution

Pour faire correspondre correctement les valeurs numériques, utilisez plutôt le modèle suivant :

pattern = r'-?\d*\.?\d+'

Ce motif correspond à :

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

Avec ce modèle corrigé, re.findall renverra la liste attendue :

['123', '3.1415926']

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