Python – Comprueba si los últimos caracteres de una cadena son números

Básicamente quiero saber cómo haría esto.

Aquí hay una cadena de ejemplo:

string = "hello123" 

Me gustaría saber cómo verificar si la cadena termina en un número y luego imprimir el número en que termina la cadena.

Sé que para esta cadena determinada puede usar expresiones regulares para determinar si termina con un número, luego use la cadena [:] para seleccionar “123”. PERO si estoy haciendo un bucle a través de un archivo con cadenas como esta:

 hello123 hello12324 hello12435436346 

… Entonces no podré seleccionar el número usando la cadena [:] debido a la diferenciación en las longitudes de los números. Espero haber explicado lo que necesito lo suficientemente claro para que ustedes ayuden. ¡Gracias!

 import re m = re.search(r'\d+$', string) # if the string ends in digits m will be a Match object, or None otherwise. if m is not None: print m.group() 

\d coincide con un dígito numérico, \d+ significa que coincida con uno o más dígitos (codicioso: coincida con tantos consecutivos como sea posible). Y $ significa coincidir con el final de la cadena.

Esto no tiene en cuenta nada en el medio de la cadena, pero básicamente dice que si el último número es un dígito, termina con un número.

 In [4]: s = "hello123" In [5]: s[-1].isdigit() Out[5]: True 

Con unas cuantas cuerdas:

 In [7]: for s in ['hello12324', 'hello', 'hello1345252525', 'goodbye']: ...: print s, s[-1].isdigit() ...: hello12324 True hello False hello1345252525 True goodbye False 

Apoyo completamente y completamente la (s) solución (es) de expresiones regulares, pero aquí hay una forma (no bonita) de obtener el número. Una vez más, regex es mucho mejor aquí 🙂

 In [43]: from itertools import takewhile In [44]: s = '12hello123558' In [45]: r = s[-1::-1] In [46]: d = [c.isdigit() for c in r] In [47]: ''.join((i[0] for i in takewhile(lambda (x, y): y, zip(r, d))))[-1::-1] Out[47]: '123558' 

Otra solución: vea cuántos dígitos 0 a 9 puede quitar del final de la cadena y use esa longitud como un índice en una cadena para dividir el número. (Devuelve '' en caso de que la cadena no termine en un número).

 In [1]: s = '12hello123558' In [2]: s[len(s.rstrip('0123456789')):] Out[2]: '123558' 

Este simplemente devolverá una cadena vacía si la cadena termina con algo que no es un número.

 import re re.split('[^\d]', str)[-1] 

Como una cadena vacía es falsa , puedes sobrecargar el significado:

 def getNumericTail(str): re.split('[^\d]', str)[-1] def endsWithNumber(str): bool(getNumericTail(str)) 

otra solución:

 a = "abc1323" b = "" for c in a[::-1]: try: b += str(int(c)) except: break print b[::-1]