2012-04-05 10 views
5

W tym programie, który próbuję wykonać, mam wyrażenie (takie jak "I = 23 mm" lub "H = 4V") i próbuję wyodrębnić 23 (lub 4) z niego, dzięki czemu mogę przekształcić go w liczbę całkowitą.Wyodrębnianie liczby z ciągu 1-słownego

Problem, który napotykam, polega na tym, że ponieważ wyrażenie, z którego próbuję usunąć liczby, jest 1 słowem, nie mogę użyć polecenia split() ani niczego.

Jednym z przykładów widziałem, ale nie byłby to praca -

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

byłby to działa, ponieważ trwa tylko numery te są rozdzielane spacjami. Jeśli w słowie int078vert znajduje się liczba, to nie wyodrębni go. Ponadto, moje nie ma spacji, aby ograniczyć.

Próbowałem jednego, który wyglądał tak,

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

ale nie działać albo, ponieważ liczba, która jest przekazywana nie zawsze jest to 2 cyfry. Może to być coś w rodzaju 5 lub coś w rodzaju 13.6.

Jaki kod muszę pisać tak, że jeśli mijam łańcuch, taki jak

I="I=2.4A" 

lub

I="A=3V" 

Tak, że można wyodrębnić tylko liczby z tego ciągu? (i robić na nim operacje)? Nie ma spacji ani innych stałych znaków, które można ograniczyć.

+0

Wygląda na to jesteś próbuje rozwiązać ten problem dla liczb całkowitych i dziesiętnych. Czy każdy ciąg ma zawsze dokładnie jeden numer? – yoozer8

+0

Tak. Każdy ciąg ma zawsze 1 numer, ale może mieć wiele miejsc dziesiętnych, aby ten numer. – Kyle

Odpowiedz

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

Wielkie dzięki. Działało dobrze. – Kyle

3

RE jest chyba dobre dla tego, ale jako jeden RE odpowiedź została już wysłana, wezmę swój non-regex przykład i zmodyfikować go:


One example I saw but wouldnt work was - 

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

Dobrą rzeczą jest to, że split() może przyjmować argumenty. Spróbuj tego:

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

Nawiasem mówiąc, tu jest podział RE podałeś:

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

Jednym ze sposobów, aby to zrobić (prawidłowo) byłoby:

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

Twoje podzielone rozwiązanie jest całkiem zadbane: D. +1 –

+0

Doceń inną metodę. +1 – Kyle

Powiązane problemy