2012-04-05 17 views
5

In diesem Programm versuche ich zu machen, ich habe einen Ausdruck (wie "I = 23mm" oder "H = 4V") und ich versuche, die 23 (oder die 4) daraus, so dass ich es in eine ganze Zahl verwandeln kann.Eine Zahl aus einer 1-Wort-Zeichenfolge extrahieren

Das Problem, mit dem ich fortfahre, ist, dass, da der Ausdruck, den ich versuche, die Zahlen aus 1 Wort zu nehmen, ich split() oder irgendetwas nicht verwenden kann.

Ein Beispiel, das ich sah, aber wouldnt Arbeit war -

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

Dies würde nicht funktionieren, weil es dauert nur die Zahlen werden durch Leerzeichen getrennt. Wenn es im Wort int078vert eine Zahl gäbe, würde sie es nicht extrahieren. Außerdem hat meine keine Leerzeichen zum Abgrenzen.

habe ich versucht, eine, die so aussah,

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

aber es hat nicht funktioniert entweder, weil die Zahl, die nicht immer übergeben werden 2-stellig ist. Es könnte etwa 5 oder etwas wie 13,6 sein.

Welcher Code muss ich so schreiben, dass, wenn ich übergeben Sie einen String, wie

I="I=2.4A" 

oder

I="A=3V" 

Damit ich nur die Nummer aus dieser Zeichenfolge extrahieren? (und Operationen darauf machen)? Es gibt keine Leerzeichen oder andere konstante Zeichen, die ich abgrenzen kann.

+0

Es sieht aus wie Sie sind versuchen, dies für Integer und Dezimalzahlen zu lösen. Wird jede Saite immer genau eine Nummer haben? – yoozer8

+0

Ja. Jede Zeichenfolge hat immer eine Zahl, aber möglicherweise mehrere Dezimalstellen, um diese Zahl zu bilden. – Kyle

Antwort

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

Vielen Dank. Gut gearbeitet. – Kyle

3

RE ist wahrscheinlich gut für diese, sondern als ein RE hat Antwort bereits gebucht, ich werde deine ohne reguläre Ausdrücke Beispiel nehmen und ändern Sie es:


One example I saw but wouldnt work was - 

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

Das Gute ist, dass split() Argumente übernehmen kann. Versuchen Sie folgendes:

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

Übrigens, hier ist eine Aufschlüsselung der RE Sie geliefert:

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

Eine Möglichkeit, es zu tun (richtig) sein würde:

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

Ihre Split-Lösung ist recht ordentlich: D. +1 –

+0

Schätzen Sie die andere Methode. +1 – Kyle

Verwandte Themen