Maison >développement back-end >Tutoriel Python >Pourquoi `re.findall()` renvoie-t-il des résultats vides lors de la correspondance de nombres à virgule flottante en Python ?

Pourquoi `re.findall()` renvoie-t-il des résultats vides lors de la correspondance de nombres à virgule flottante en Python ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-22 07:07:10840parcourir

Why Does `re.findall()` Return Empty Results When Matching Floating-Point Numbers in Python?

re.findall Misbehavior : Résultats vides indésirables

Dans le scénario donné, tandis que re.search() a extrait avec succès la valeur numérique prévue " 123" de la chaîne source, re.findall() a produit de manière inattendue un résultat vide.

Après enquête, le coupable a été identifié comme le r'\.' partie du modèle regex. Dans les chaînes brutes (préfixées par r), \ est traité littéralement, correspondant à un caractère barre oblique inverse suivi de n'importe quel caractère sauf une nouvelle ligne. Cependant, ce n'est pas le comportement prévu pour capturer des nombres à virgule flottante.

Pour résoudre le problème, le modèle corrigé, -?d*.?d , suit ces principes :

  • -? correspond à un signe moins facultatif.
  • d* correspond à des chiffres facultatifs.
  • .? correspond à un séparateur décimal facultatif.
  • d correspond à un ou plusieurs chiffres.

En utilisant ce modèle révisé, re.findall() identifie désormais correctement les valeurs numériques dans la chaîne source :

import re

s = r'abc123d, hello 3.1415926, this is my book'
pattern = r'-?\d*\.?\d+'
L = re.findall(pattern, s)
print(L)  # Output: ['123', '3.1415926']

N'oubliez pas que pour que re.findall() renvoie des valeurs de correspondance sans capturer de groupes, le modèle doit être exempt de tout groupe de capture ou groupes non capturants (par exemple (?:)), sauf s'il y a des références arrière dans le modèle.

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