Maison > développement back-end > Tutoriel Python > Pourquoi « re.findall » ne parvient-il pas à trouver des nombres dans une chaîne lorsque « re.search » réussit ?

Pourquoi « re.findall » ne parvient-il pas à trouver des nombres dans une chaîne lorsque « re.search » réussit ?

Mary-Kate Olsen
Libérer: 2024-12-29 13:21:11
original
909 Les gens l'ont consulté

Why Does `re.findall` Fail to Find Numbers in a String When `re.search` Succeeds?

re.findall se comporte de manière imprévisible

Avec la chaîne et le motif d'origine tels que définis ci-dessous :

s = r'abc123d, hello 3.1415926, this is my book'
pattern = r'-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+'
Copier après la connexion

re. La recherche trouve avec précision une correspondance, tandis que re.findall donne une liste vide. Ce comportement, qui contredit le résultat attendu de ['123', '3.1415926'], soulève la question de savoir pourquoi re.findall ne produit pas ce résultat.

Comprendre le problème

Deux considérations clés sont en jeu ici :

  1. Capture de groupes : re.findall extrait et renvoie uniquement le texte capturé lorsque le modèle d'expression régulière contient des groupes de capture.
  2. Correspondance littérale de barre oblique inverse : Le \ dans le modèle tente de correspondre à un littéral plutôt qu'à celui prévu. caractère.

Modification Regex

Pour résoudre ce problème, nous pouvons modifier le modèle pour supprimer les groupes de capture redondants et faire correspondre correctement les numéros :

pattern = r'-?\d*\.?\d+'
Copier après la connexion

Ce modèle correspondra :

  • -?d* : signe moins facultatif et zéro ou plus chiffres
  • .? : Séparateur décimal optionnel
  • d : Un ou plusieurs chiffres

Résultats

Utilisation de ce modifié modèle, re.findall produira le résultat attendu :

import re
L = re.findall(pattern, s)
print(L)  # Output: ['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