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?
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
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
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
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.
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)
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
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).
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
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.')
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
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.
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
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.
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.
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".