Python >> Tutoriel Python >  >> Python

Comment extraire des nombres d'une chaîne en Python ?

Résumé : Pour extraire des nombres d'une chaîne donnée en Python, vous pouvez utiliser l'une des méthodes suivantes :

  • Utilisez le regex module.
  • Utilisez split() et append() fonctions sur une liste.
  • Utiliser une compréhension de liste avec isdigit() et split() fonctions.
  • Utilisez le num_from_string module.

L'extraction de chiffres ou de nombres d'une chaîne donnée peut survenir assez souvent dans votre parcours de codage. Que vous automatisez un script en python et que vous souhaitiez extraire certains chiffres d'un fichier CSV ou que vous soyez un scientifique des données et que vous ayez besoin de séparer des chiffres et des chiffres complexes à partir de modèles donnés ou que vous soyez un passionné de python qui souhaite en savoir plus sur chaînes et types de données numériques, vous trouverez certainement cet article utile. Cela dit, plongeons-nous dans notre question essentielle :

Problème : Étant donné une chaîne ; comment extraire des nombres de la chaîne en Python ?

Exemple : Considérez que vous avez reçu une chaîne et que vous souhaitez extraire tous les nombres de la chaîne comme indiqué dans l'exemple suivant :

Donné est la chaîne suivante :

Extract 100, 1000 and 10000 from this string

Voici la sortie souhaitée :

[100, 1000, 10000]

Discutons des méthodes que nous pouvons utiliser pour extraire les nombres de la chaîne donnée :

Méthode 1 :Utiliser le module Regex

L'approche la plus efficace pour résoudre notre problème consiste à tirer parti de la puissance du regex module. Vous pouvez facilement utiliser des expressions régulières (RegEx ) pour vérifier ou vérifier si une chaîne donnée contient un modèle spécifié (que ce soit un chiffre ou un caractère spécial ou tout autre modèle).

Ainsi, pour résoudre notre problème, nous devons importer le module regex qui est déjà inclus dans la bibliothèque standard de Pythons, puis à l'aide du findall() fonction, nous pouvons extraire les nombres de la chaîne donnée.

findall() est une fonction regex facile à utiliser qui renvoie une liste contenant toutes les correspondances. Pour en savoir plus sur findall() consultez notre tutoriel de blog ici.

Examinons le code suivant pour comprendre comment nous pouvons utiliser le regex module pour résoudre notre problème :

import re

sentence = 'Extract 100 , 100.45 and 10000 from this string'
s = [float(s) for s in re.findall(r'-?\d+\.?\d*', sentence)]
print(s)

Sortie

[100.0, 100.45, 10000.0]

Méthode 2 :diviser et ajouter les nombres à une liste à l'aide des fonctions split() et append()

Une autre solution de contournement pour notre problème consiste à diviser la chaîne donnée en utilisant le split() fonction puis extrayez les nombres en utilisant le float() intégré méthode puis ajoutez les nombres extraits à la liste.

Remarque :

  • split() est une méthode python intégrée qui est utilisée pour diviser une chaîne en une liste.
  • append() est une méthode intégrée en python qui ajoute un élément à la fin d'une liste.

Maintenant que nous avons les outils nécessaires pour résoudre notre problème basé sur le concept ci-dessus, plongeons dans le code pour voir comment cela fonctionne :

sentence = 'Extract 100 , 100.45 and 10000 from this string'

s = []
for t in sentence.split():
    try:
        s.append(float(t))
    except ValueError:
        pass
print(s)

Sortie

[100.0, 100.45, 10000.0]

Méthode 3 :Utilisation de la fonction isdigit() dans une compréhension de liste

Une autre approche pour résoudre notre problème consiste à utiliser le isdigit() fonction intégrée pour extraire les chiffres de la chaîne, puis les stocker dans une liste à l'aide d'une compréhension de liste. Le isdigit() La fonction est utilisée pour vérifier si une chaîne donnée contient des chiffres. Ainsi s'il trouve un caractère qui est un chiffre alors il renvoie True, sinon il renvoie False.

Examinons le code ci-dessous pour voir comment fonctionne le concept ci-dessus :

sentence = 'Extract 100 , 100.45 and 10000 from this string'
s = [int(s) for s in str.split(sentence) if s.isdigit()]
print(s)

Sortie

[100, 10000]

☢ Alerte ! Cette technique est la mieux adaptée pour extraire uniquement des entiers positifs. Cela ne fonctionnera pas pour les entiers négatifs, les flottants ou les nombres hexadécimaux.

Méthode 4 :Utilisation des nombres de la bibliothèque de chaînes

C'est un hack rapide si vous voulez éviter de perdre du temps à taper du code explicite pour extraire des nombres d'une chaîne. Vous pouvez importer une bibliothèque appelée nums_from_string puis l'utiliser pour extraire des nombres d'une chaîne donnée. Il contient plusieurs règles regex avec une couverture complète et peut être un outil très utile pour les chercheurs en PNL.

Étant donné que la bibliothèque Numbers from String ne fait pas partie de la bibliothèque Python standard, vous devez l'installer avant de pouvoir l'utiliser. Utilisez la commande suivante pour installer cette bibliothèque utile :

pip install nums_from_string

Le programme suivant illustre l'utilisation de nums_from_string :

import nums_from_string

sentence = 'Extract 100 , 100.45 and 10000 from this string'
print(nums_from_string.get_nums(sentence))

Sortie

[100.0, 100.45, 10000.0]

Conclusion

Ainsi, à partir des discussions ci-dessus, nous avons constaté qu'il existe de nombreuses façons d'extraire un nombre d'une chaîne donnée en python. Mon préféré serait certainement le module regex. Vous pourriez dire que l'utilisation d'autres méthodes comme le isdigit() et split() les fonctions fournissent un code plus simple et plus lisible et sont plus rapides. Cependant, comme mentionné précédemment, il ne renvoie pas les nombres négatifs (en référence à la méthode 2) et ne fonctionne pas non plus pour les flottants qui n'ont pas d'espace entre eux et d'autres caractères comme '25.50k' (en référence à la méthode 2). De plus, la vitesse est une sorte de métrique non pertinente en ce qui concerne l'analyse des journaux. Vous voyez maintenant pourquoi regex est mon préféré dans cette liste de solutions.

Dans le cas où vous n'êtes pas très favorable à la bibliothèque re, notamment parce que vous avez du mal à maîtriser ce concept (tout comme moi au début), voici LE TUTORIEL pour devenir un maître des regex. ?

J'espère que vous avez trouvé cet article utile et ajouté de la valeur à votre parcours de codage. Veuillez rester à l'écoute pour des choses plus intéressantes à l'avenir.