web-dev-qa-db-fra.com

Détecter si une chaîne Python est un nombre ou une lettre

Comment détecter des chiffres ou des lettres dans une chaîne? Je sais que vous utilisez les codes ASCII, mais quelles fonctions en tirent parti?

25
TriskelionKal

Vérifier si la chaîne est positif digit (entier) et l'alphabet

Vous pouvez utiliser str.isdigit() et str.isalpha() vérifier si la chaîne donnée est positif entier et alphabet respectivement.

Exemples de résultats:

# For alphabet
>>> 'A'.isdigit()
False
>>> 'A'.isalpha()
True

# For digit
>>> '1'.isdigit()
True
>>> '1'.isalpha()
False

Vérifier que les chaînes sont positives/négatives - entier/float

str.isdigit() renvoie False si la chaîne est un nombre négatif ou un nombre flottant. Par exemple:

# returns `False` for float
>>> '123.3'.isdigit()
False
# returns `False` for negative number
>>> '-123'.isdigit()
False

Si vous voulez vérifiez également les entiers négatif et float, vous pouvez écrire une fonction personnalisée dans vérifier comme:

def is_number(n):
    try:
        float(n)   # Type-casting the string to `float`.
                   # If string is not a valid `float`, 
                   # it'll raise `ValueError` exception
    except ValueError:
        return False
    return True

Exemple de cycle:

>>> is_number('123')    # positive integer number
True

>>> is_number('123.4')  # positive float number
True

>>> is_number('-123')   # negative integer number
True

>>> is_number('-123.4') # negative `float` number
True

>>> is_number('abc')    # `False` for "some random" string
False

Jeter les chaînes "NaN" (pas un nombre) tout en vérifiant le numéro

Les fonctions ci-dessus renverront True pour la chaîne "NAN" (pas un nombre) car pour Python, il s'agit d'un flottant valide, ce qui signifie qu'il ne s'agit pas d'un nombre. Par exemple:

>>> is_number('NaN')
True

Afin de vérifier si le numéro est "NaN", vous pouvez utiliser math.isnan() comme:

>>> import math
>>> nan_num = float('nan')

>>> math.isnan(nan_num)
True

Ou si vous ne souhaitez pas importer de bibliothèque supplémentaire pour vérifier cela, vous pouvez simplement le vérifier en le comparant avec lui-même en utilisant ==. Python renvoie False lorsque nan float est comparé à lui-même. Par exemple:

# `nan_num` variable is taken from above example
>>> nan_num == nan_num
False

Par conséquent, ci-dessus la fonction is_number peut être mise à jour pour renvoyer False pour "NaN" comme:

def is_number(n):
    is_number = True
    try:
        num = float(n)
        # check for "nan" floats
        is_number = num == num   # or use `math.isnan(num)`
    except ValueError:
        is_number = False
    return is_number

Exemple de cycle:

>>> is_number('Nan')   # not a number "Nan" string
False

>>> is_number('nan')   # not a number string "nan" with all lower cased
False

>>> is_number('123')   # positive integer
True

>>> is_number('-123')  # negative integer
True

>>> is_number('-1.12') # negative `float`
True

>>> is_number('abc')   # "some random" string
False

Autoriser les numéros complexes du type "1 + 2j" à être traités comme des numéros valides

La fonction ci-dessus vous retournera quand même False pour le nombres complexes . Si vous voulez que votre fonction is_number _ traite les nombres complexes comme un nombre valide , vous devez alors entrer la chaîne que vous avez passée en tant que complex() au lieu de float() . Ensuite, votre fonction is_number ressemblera à ceci:

def is_number(n):
    is_number = True
    try:
        #      v type-casting the number here as `complex`, instead of `float`
        num = complex(n)
        is_number = num == num
    except ValueError:
        is_number = False
    return is_number

Exemple de cycle:

>>> is_number('1+2j')    # Valid 
True                     #      : complex number 

>>> is_number('1+ 2j')   # Invalid 
False                    #      : string with space in complex number represetantion
                         #        is treated as invalid complex number

>>> is_number('123')     # Valid
True                     #      : positive integer

>>> is_number('-123')    # Valid 
True                     #      : negative integer

>>> is_number('abc')     # Invalid 
False                    #      : some random string, not a valid number

>>> is_number('nan')     # Invalid
False                    #      : not a number "nan" string

PS: chaque opération pour chaque contrôle, en fonction du type de numéro, s'accompagne d'une surcharge supplémentaire. Choisissez la version de la fonction is_number correspondant à vos besoins.

57
Moinuddin Quadri

Pour une chaîne de longueur 1, vous pouvez simplement effectuer isdigit() ou isalpha()

Si la longueur de votre chaîne est supérieure à 1, vous pouvez créer une fonction similaire à ..

def isinteger(a):
    try:
        int(a)
        return True
    except ValueError:
        return False
2
esquarer