2012-04-05 20 views
5

Yapmaya çalıştığım bu programda, bir ifadem var ("I = 23mm" veya "H = 4V" gibi) ve 23'ü çıkarmaya çalışıyorum. veya 4) bunun dışında bir tamsayıya dönüştürebilirim.1-word dizgisinden bir sayının çıkarılması

Yayılmaya devam ettiğim sorun, sayıları 1 kelimeyi almaya çalıştığım için split() veya başka bir şey kullanamıyorum.

bir örneği gördüm ama wouldnt çalışmaydı -

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

sadece sayılar boşluklarla ayrılmış olan edilir sürer, çünkü bu işe yaramaz. Int078vert kelimesinde bir sayı varsa, onu ayıklamazdı. Ayrıca benim de sınırlamak için boşlukları yok.

Ben böyle görünüyordu birini

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

çalıştı ama geçirilmediğini sayısı her zaman 2 basamak olmadığı için, ya da işe yoktu. 5 ya da 13.6 gibi bir şey olabilir.

Ne kod Öyle yazmaya gerek olmadığı Ben

I="I=2.4A" 

veya

bu dize tek çıkış sayısını ayıklayabileceğinden Yani
I="A=3V" 

gibi bir dize, geçirirseniz? (ve üzerinde işlemler yapmak)? Sınırlayabileceğim boşluk ya da başka sabit karakterler yok.

+0

Ama sence benziyor

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

, burada sağlanan RE bir dökümünü Bu tamsayı ve ondalık sayıları için çözmeye çalışıyorum. Her dizginin her zaman tam olarak bir numarası olacak mı? – yoozer8

+0

Evet. Her dizenin her zaman 1 numarası olur, ancak bu sayıyı yapmak için birden çok ondalık basamak olabilir. – Kyle

cevap

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

Çok teşekkürler. İyi çalıştı. – Kyle

3

RE bunun için muhtemelen iyidir, ama cevap önceden gönderilmiş olan bir RE olarak, senin olmayan regex örnek alıp değiştirirler:


One example I saw but wouldnt work was - 

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

İyi olan şey, split()'un argümanları alabilmesidir. Bu deneyin: olacaktı (doğru) bunu yapmak için

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

Tek yönlü:

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

Bölünmüş çözümünüz oldukça düzgün: D. +1 –

+0

Farklı yöntemi takdir edin. +1 – Kyle