Compruebe si una cadena contiene un número

La mayoría de las preguntas que he encontrado están sesgadas en el hecho de que están buscando letras en sus números, mientras que estoy buscando números en lo que me gustaría que fuera una cadena sin número. Necesito ingresar una cadena y verificar si contiene algún número y si lo rechaza.

La función isdigit() solo devuelve True si TODOS los caracteres son números. Solo quiero ver si el usuario ha ingresado un número, por lo que una oración como “Tengo 1 perro” o algo así.

¿Algunas ideas?

Puedes usar any función, con la función str.isdigit , como esta

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

Alternativamente puedes usar una Expresión Regular, como esta

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

Puedes usar una combinación de any y str.isdigit :

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

La función devolverá True si existe un dígito en la cadena, de lo contrario False .

Manifestación:

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

Deberías usar mejor la expresión regular. Es mucho más rápido.

 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 

utilizar

  str.isalpha () 

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

Devuelva verdadero si todos los caracteres de la cadena son alfabéticos y hay al menos un carácter, de lo contrario, falso.

Podría aplicar la función isdigit () en cada carácter de la cadena. O podrías usar expresiones regulares.

También encontré ¿Cómo encuentro un número en una cadena en Python? Con formas muy adecuadas para devolver números. La solución a continuación es de la respuesta en esa pregunta.

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

Alternativamente:

 number = filter(str.isdigit, yourString) 

Para obtener más información, consulte la documentación de expresiones regulares: http://docs.python.org/2/library/re.html

Editar: Esto devuelve los números reales, no un valor booleano, por lo que las respuestas anteriores son más correctas para su caso

El primer método devolverá el primer dígito y los dígitos consecutivos subsiguientes. Por lo tanto, 1.56 se devolverá como 1. 10,000 se devolverá como 10. 0207-100-1000 se devolverá como 0207.

El segundo método no funciona.

Para extraer todos los dígitos, puntos y comas, y no perder dígitos no consecutivos, use:

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

¿Qué hay de este?

 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 

Puedes lograr esto de la siguiente manera:

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

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

El uso de .isdigit() también significa no tener que recurrir al manejo de excepciones (probar / exceptuar) en los casos en que necesite usar la comprensión de lista (intentar / excepto no es posible dentro de una comprensión de lista).

Puedes usar el método NLTK para ello.

Esto encontrará tanto ‘1’ como ‘Uno’ en el texto:

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

Puede usar el rango con conteo para verificar cuántas veces aparece un número en la cadena, comparándolo con el rango:

 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 

Una forma más sencilla de resolver es como

 s = '1dfss3sw235fsf7s' count = 0 temp = list(s) for item in temp: if(item.isdigit()): count = count + 1 else: pass print count 

Me sorprende que nadie mencione esta combinación de any y el map :

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

en Python 3 es probablemente el más rápido allí (excepto quizás para expresiones regulares) porque no contiene ningún bucle (y alias la función evita buscarlo en str ).

No lo uses en Python 2 ya que el map devuelve una list , lo que rompe any cortocircuito

 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) 

Este código genera una secuencia con tamaño n que al menos contiene una letra mayúscula, minúscula y un dígito. Al utilizar el bucle while, garantizamos este evento.