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
833 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!

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