2012-07-05 17 views
27

supongamos que hubiese una cadena¿Cómo obtener valores enteros de una cadena en Python?

string1 = "498results should get" 

Ahora necesito para obtener sólo los valores enteros de la cadena como 498. Aquí no quiero utilizar list slicing debido a que los valores enteros pueden aumentar como estos ejemplos:

string2 = "49867results should get" 
string3 = "497543results should get" 

así que quiero conseguir sólo valores enteros a partir de la cadena exactamente en el mismo orden. Me refiero a 498,49867,497543 desde string1,string2,string3 respectivamente.

¿Alguien me puede decir cómo hacerlo en una o dos líneas?

+0

@ Bill el lagarto: Gracias por la edición –

Respuesta

61
>>> import re 
>>> string1 = "498results should get" 
>>> int(re.search(r'\d+', string1).group()) 
498 

Si hay varios números enteros en la cadena:

>>> map(int, re.findall(r'\d+', string1)) 
[498] 
+1

Muchas gracias muchachos, mucha ayuda ... –

+3

esto no es exactamente correcto, sí, lo hará para la cadena ** comenzando ** con un número entero, pero si el entero está en el medio de la cadena, ganó ' hacer Quizás debería ser mejor usar 'int (re.search (r '\ d +', string1) .group())' – eLRuLL

+1

Si 'string1' es ** (020) 3493 **, falla. – Hussain

7

versión iterador

>>> import re 
>>> string1 = "498results should get" 
>>> [int(x.group()) for x in re.finditer(r'\d+', string1)] 
[498] 
7
>>> import itertools 
>>> int(''.join(itertools.takewhile(lambda s: s.isdigit(), string1))) 
+1

Esto solo funcionará si el número está al comienzo de la cadena. Además, ¿por qué no usar 'str.isdigit' en lugar de lambda? –

+2

Esto también podría escribirse como 'int (''. Join (itertools.takewhile (str.isdigit, string1)))'. En realidad, nunca usaría ninguno de los métodos ya que esto es complicado. – jamylak

+0

https://groups.google.com/forum/?hl=en&fromgroups#!msg/alt.religion.emacs/DR057Srw5-c/Co-2L2BKn7UJ –

7

si tiene varios conjuntos de números, entonces esto es otra opción

>>> import re 
>>> print(re.findall('\d+', 'xyz123abc456def789')) 
['123', '456', '789'] 

su no es bueno para flotar cadenas de números de punto, sin embargo.

5

Aquí está tu sola línea, sin necesidad de utilizar ningún expresiones regulares, que puede ser caro a veces:

>>> ''.join(filter(str.isdigit, "1234GAgade5312djdl0")) 

devuelve:

'123453120' 
0
def function(string): 
    final = '' 
    for i in string: 
     try: 
      final += str(int(i)) 
     except ValueError: 
      return int(final) 
print(function("4983results should get")) 
Cuestiones relacionadas