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
Libérer: 2024-12-19 09:23:09
original
174 Les gens l'ont consulté

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'
Copier après la connexion

Et le modèle suivant :

pattern = r'-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+'
Copier après la connexion

Avec re.search, nous obtenons le bon result :

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

Cependant, re.findall renvoie une liste vide :

L = re.findall(pattern, s)
print(L)  # []
Copier après la connexion

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+'
Copier après la connexion

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']
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!

source:php.cn
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