2012-07-05 3 views
27

Supponiamo che ho avuto una stringaCome ottenere valori interi da una stringa in Python?

string1 = "498results should get" 

Ora ho bisogno di ottenere solo valori interi dalla stringa come 498. Qui io non voglio usare list slicing perché i valori interi possono aumentare come questi esempi:

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

quindi voglio ottenere solo i valori interi fuori dalla stringa esattamente nello stesso ordine. Voglio dire come 498,49867,497543 da string1,string2,string3 rispettivamente.

Qualcuno può farmi sapere come farlo in una o due righe?

+0

@ Bill the Lizard: Grazie per l'editing –

risposta

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

Se ci sono più numeri interi nella stringa:

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

Grazie mille ragazzi che molto utili ... –

+3

questo non è esattamente corretto, sì lo farà per stringa ** iniziando ** con un numero intero, ma se il numero intero è nel mezzo della stringa, ha vinto ' lo faccio Forse dovrebbe essere meglio usare 'int (re.search (r '\ d +', string1) .group())' – eLRuLL

+1

Se 'string1' è ** (020) 3493 **, fallisce. – Hussain

7

versione Iterator

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

Questo funzionerà solo se il numero è all'inizio della stringa. Inoltre, perché non usare 'str.isdigit' invece del lambda? –

+2

Questo potrebbe anche essere scritto come 'int (''. Join (itertools.takewhile (str.isdigit, string1)))'. Non utilizzerei mai nessuno dei due metodi, poiché ciò è molto complicato. – jamylak

+0

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

7

se si dispone di più insiemi di numeri allora questa è un'altra opzione

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

sua non va bene per virgola mobile stringhe numeriche però.

5

Ecco la tua one-liner, senza l'uso di espressioni regolari, che può diventare molto costoso, a volte:

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

rendimenti:

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