2012-04-05 16 views
5

In questo programma sto cercando di fare, ho un'espressione (come "I = 23mm" o "H = 4V") e sto cercando di estrarre il 23 (o il 4) fuori di esso, in modo che io possa trasformarlo in un numero intero.Estrazione di un numero da una stringa di 1 parola

Il problema che continuo a subire è che poiché l'espressione che sto cercando di prendere i numeri è 1 parola, non posso usare split() o altro.

Un esempio che ho visto, ma il lavoro wouldnt era -

I="I=2.7A" 
[int(s) for s in I.split() if s.isdigit()] 

Questo wouldnt funziona perché ci vuole solo i numeri sono sono delimitati da spazi. Se c'era un numero nella parola int078vert, non lo estraeva. Inoltre, il mio non ha spazi da delimitare.

Ho provato uno che si presentava così,

re.findall("\d+.\d+", "Amps= 1.4 I") 

ma non ha funzionato neanche, perché il numero che viene passato non è sempre 2 cifre. Potrebbe essere qualcosa come 5, o qualcosa come 13.6.

Quale codice devo scrivere così che se mi passa una stringa, come ad esempio

I="I=2.4A" 

o

I="A=3V" 

In modo che posso estrarre solo il numero di questa stringa? (e fare operazioni su di esso)? Non ci sono spazi o altri caratteri costanti che posso delimitare.

+0

Sembra che tu sei cercando di risolvere questo per i numeri interi e decimali. Ogni stringa avrà sempre esattamente un numero? – yoozer8

+0

Sì. Ogni stringa avrà sempre un numero, ma potrebbe avere più decimali per ottenere quel numero. – Kyle

risposta

11
>>> import re 
>>> I = "I=2.7A" 
>>> s = re.search(r"\d+(\.\d+)?", I) 
>>> s.group(0) 
'2.7' 
>>> I = "A=3V" 
>>> s = re.search(r"\d+(\.\d+)?", I) 
>>> s.group(0) 
'3' 
>>> I = "I=2.723A" 
>>> s = re.search(r"\d+(\.\d+)?", I) 
>>> s.group(0) 
'2.723' 
+0

Grazie mille. Ha funzionato bene – Kyle

3

RE è probabilmente buono per questo, ma come una risposta RE è già stato pubblicato, mi prendo il tuo esempio non regex e modificarlo:


One example I saw but wouldnt work was - 

I="I=2.7A" 
[int(s) for s in I.split() if s.isdigit()] 

La cosa buona è che split() può accettare argomenti. Prova questo:

extracted = float("".join(i for i in I.split("=")[1] if i.isdigit() or i == ".")) 

Per inciso, ecco una ripartizione del RE da Lei forniti:

"\d+.\d+" 
\d+ #match one or more decimal digits 
. #match any character -- a lone period is just a wildcard 
\d+ #match one or more decimal digits again 

Un modo per farlo (correttamente) sarebbe:

"\d+\.?\d*" 
\d+ #match one or more decimal digits 
\.? #match 0 or 1 periods (notice how I escaped the period) 
\d* #match 0 or more decimal digits 
+0

La soluzione split è abbastanza ordinata: D. +1 –

+0

Apprezzo il diverso metodo. +1 – Kyle

Problemi correlati