2012-04-05 14 views
5

이 프로그램에서는 "I = 23mm"또는 "H = 4V"와 같은 표현이 있고 23을 추출하려고합니다. 또는 4) 그것을 밖으로, 그래서 정수로 설정할 수 있습니다.1 단어 문자열에서 숫자 추출

나는 계속해서 문제가되는 것은 숫자를 빼내려는 표현이 1 단어이므로 split() 또는 아무것도 사용할 수 없다는 것입니다.

한 예로 나는 보았다하지만 wouldnt하는 작업이었다 -

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

그것은 단지 숫자가 공백으로 구분되어 있습니다 걸리기 때문에이 작업을 wouldnt. int078vert라는 단어에 숫자가 있으면 추출하지 않겠습니다. 또한, 광산 doesnt에는 한계를 정할 공간이 있습니다.

나는이처럼 보였다 하나,

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

을 시도했지만 전달되는 숫자는 항상 2 개 자리가 아니기 때문에 그것은 하나가 작동 didnt한다. 그것은 5와 같거나 13.6과 같을 수 있습니다.

어떤 코드 내가 그렇게 작성해야 할 것을 나는

I="I=2.4A" 

또는

내가이 문자열에서 단지 수를 추출 할 수 있도록
I="A=3V" 

와 같은 문자열을 전달하면? (그리고 그것에 대한 작업을합니까?) 내가 구분할 수있는 공백이나 다른 상수 문자는 없습니다.

+0

그것은 당신처럼 보이는

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

가, 여기가 제공 한 RE의 고장입니다 정수 및 십진수 모두에 대해이 문제를 해결하려고합니다. 각 문자열에는 항상 정확히 하나의 숫자가 포함됩니까? – yoozer8

+0

예. 각 문자열은 항상 1 개의 숫자를 갖지만 해당 숫자를 만들기 위해 여러 개의 소수를 가질 수 있습니다. – Kyle

답변

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

고마워. 잘 했어. – Kyle

3

RE는 이에 대한 아마 좋은,하지만 대답이 이미 게시 된 하나의 RE로, 당신이 아닌 정규식 예를 가지고 수정할 수 있습니다 :


One example I saw but wouldnt work was - 

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

좋은 점은 split()이 인수를 취할 수 있다는 것입니다. 이 시도 : 될 것이다 (정확하게) 그것을 할 수

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

한 가지 방법 :

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

분할 솔루션은 매우 깔끔합니다. D. +1 –

+0

다른 방법을 생각해보십시오. +1 – Kyle