web-dev-qa-db-fra.com

Vérifier si une chaîne contient un nombre

La plupart des questions que j'ai trouvées sont biaisées sur le fait qu'elles cherchent des lettres avec leurs nombres, alors que je cherche des nombres avec ce que j'aimerais être une chaîne sans nombre .. chaîne et vérifiez si elle contient des nombres et si elle la rejette.

La fonction isdigit() ne renvoie True que si TOUS les caractères sont des nombres. Je veux juste voir si l'utilisateur a entré un nombre et une phrase telle que "Je possède 1 chien" ou quelque chose du genre.

Des idées?

130
JamesDonnelly

Vous pouvez utiliser any function, avec le str.isdigit function, comme ceci

>>> def hasNumbers(inputString):
...     return any(char.isdigit() for char in inputString)
... 
>>> hasNumbers("I own 1 dog")
True
>>> hasNumbers("I own no dog")
False

Sinon, vous pouvez utiliser une expression régulière, comme celle-ci

>>> import re
>>> def hasNumbers(inputString):
...     return bool(re.search(r'\d', inputString))
... 
>>> hasNumbers("I own 1 dog")
True
>>> hasNumbers("I own no dog")
False
191
thefourtheye

Vous pouvez utiliser une combinaison de any et str.isdigit :

def num_there(s):
    return any(i.isdigit() for i in s)

La fonction retournera True si un chiffre existe dans la chaîne, sinon False.

Démo:

>>> king = 'I shall have 3 cakes'
>>> num_there(king)
True
>>> servant = 'I do not have any cakes'
>>> num_there(servant)
False
32
aIKid

https://docs.python.org/2/library/re.html

Vous devriez mieux utiliser l'expression régulière. C'est beaucoup plus rapide.

import re

def f1(string):
    return any(i.isdigit() for i in string)


def f2(string):
    return re.search('\d', string)


# if you compile the regex string first, it's even faster
RE_D = re.compile('\d')
def f3(string):
    return RE_D.search(string)

# Output from iPython
# In [18]: %timeit  f1('assdfgag123')
# 1000000 loops, best of 3: 1.18 µs per loop

# In [19]: %timeit  f2('assdfgag123')
# 1000000 loops, best of 3: 923 ns per loop

# In [20]: %timeit  f3('assdfgag123')
# 1000000 loops, best of 3: 384 ns per loop
22
zyxue

utilisation 

str.isalpha () 

Réf: https://docs.python.org/2/library/stdtypes.html#str.isalpha

Renvoie true si tous les caractères de la chaîne sont alphabétiques et là est au moins un caractère, faux sinon.

16
K246

Vous pouvez appliquer la fonction isdigit () à chaque caractère de la chaîne. Ou vous pouvez utiliser des expressions régulières.

Aussi, j'ai trouvé Comment trouver un numéro dans une chaîne en Python? avec des moyens très appropriés pour renvoyer des numéros. La solution ci-dessous est issue de la réponse à cette question.

number = re.search(r'\d+', yourString).group()

Alternativement:

number = filter(str.isdigit, yourString)

Pour plus d'informations, consultez la documentation sur les expressions régulières: http://docs.python.org/2/library/re.html

Éditer: Ceci renvoie les nombres réels, pas une valeur booléenne, les réponses ci-dessus sont donc plus correctes pour votre cas.

La première méthode renverra le premier chiffre et les chiffres consécutifs consécutifs. Ainsi, 1,56 sera retourné sous forme de 1. 10 000 sera renvoyé sous forme de 10. 0207-100-1000 sera renvoyé sous forme de 0207. 

La deuxième méthode ne fonctionne pas.

Pour extraire tous les chiffres, points et virgules et ne pas perdre de chiffres non consécutifs, utilisez:

re.sub('[^\d.,]' , '', yourString)
6
Haini

Qu'en est-il de celui-ci?

import string

def containsNumber(line):
    res = False
    try:
        for val in line.split():
            if (float(val.strip(string.punctuation))):
                res = True
                break
    except ValueError, e:
        pass
    return res

print containsNumber('234.12 a22') # returns True
print containsNumber('234.12L a22') # returns False
print containsNumber('234.12, a22') # returns True
1
aga

Vous pouvez accomplir ceci comme suit:

if a_string.isdigit(): do_this() else: do_that()

https://docs.python.org/2/library/stdtypes.html#str.isdigit

Utiliser .isdigit() signifie également que ne pas avoir à recourir à la gestion des exceptions (try/except) dans les cas où vous devez utiliser la compréhension de liste (try/except n'est pas possible dans une compréhension de liste).

1
olisteadman

Vous pouvez utiliser range with count pour vérifier combien de fois un nombre apparaît dans la chaîne en le comparant à la plage:

def count_digit(a):
    sum = 0
    for i in range(10):
        sum += a.count(str(i))
    return sum

ans = count_digit("Apple3rh5")
print(ans)

#This print 2
1
pedmindset

Vous pouvez utiliser la méthode NLTK pour cela.

Cela trouvera à la fois "1" et "Un" dans le texte:

import nltk 

def existence_of_numeric_data(text):
    text=nltk.Word_tokenize(text)
    pos = nltk.pos_tag(text)
    count = 0
    for i in range(len(pos)):
        Word , pos_tag = pos[i]
        if pos_tag == 'CD':
            return True
    return False

existence_of_numeric_data('We are going out. Just five you and me.')
1

Un moyen plus simple de résoudre est le

s = '1dfss3sw235fsf7s'
count = 0
temp = list(s)
for item in temp:
    if(item.isdigit()):
        count = count + 1
    else:
        pass
print count
0
BlizZard
import string
import random
n = 10

p = ''

while (string.ascii_uppercase not in p) and (string.ascii_lowercase not in p) and (string.digits not in p):
    for _ in range(n):
        state = random.randint(0, 2)
        if state == 0:
            p = p + chr(random.randint(97, 122))
        Elif state == 1:
            p = p + chr(random.randint(65, 90))
        else:
            p = p + str(random.randint(0, 9))
    break
print(p)

Ce code génère une séquence de taille n qui contient au moins une majuscule, une minuscule et un chiffre. En utilisant la boucle while, nous avons garanti cet événement. 

0
Mehran Attar

Je suis surpris que personne n'ait mentionné cette combinaison de any et map:

def contains_digit(s):
    isdigit = str.isdigit
    return any(map(isdigit,s))

en python 3, c'est probablement le plus rapide (sauf peut-être pour les regex) car il ne contient aucune boucle (et la fonction aliasing évite de la regarder dans str). 

N'utilisez pas cela dans python 2 car map renvoie une list, qui rompt any en court-circuitant

0

any et ord peuvent être combinés pour atteindre l'objectif indiqué ci-dessous.

>>> def hasDigits(s):
...     return any( 48 <= ord(char) <= 57 for char in s)
...
>>> hasDigits('as1')
True
>>> hasDigits('as')
False
>>> hasDigits('as9')
True
>>> hasDigits('as_')
False
>>> hasDigits('1as')
True
>>>

Quelques points sur cette implémentation.

  1. any est préférable car il fonctionne comme une expression de court-circuit dans le langage C et retournera le résultat dès qu'il sera possible de le déterminer, c'est-à-dire que dans le cas d'une chaîne 'a1bbbbbbc' 'b' et 'c ne seront même pas comparés.

  2. ord est préférable, car il offre plus de flexibilité, par exemple, les chiffres de contrôle uniquement entre "0" et "5" ou toute autre plage. Par exemple, si vous deviez écrire un validateur pour la représentation hexadécimale de nombres, vous voudriez que la chaîne ait uniquement des alphabets dans la plage "A" à "F".

0
ViFI