2013-05-30 2 views
3
무엇 정규식 사용하여 다음 라인 표현을 추출하는 가장 좋은 방법입니다

: 나는 (예를 들어, 각 줄에서 숫자 값을 추출 할 경우의에서사용 정규식

Sigma 0.10 index = $5.00 
beta .05=$25.00 
.35 index (or $12.5) 
Gamma 0.07 

가 " 라인 $ 5.00 ""라인 1), (가능한 경우) 금액 또는에서 "0.10 1.

답변

4
import re 
s="""Sigma 0.10 index = $5.00 
beta .05=$25.00 
.35 index (or $12.5) 
Gamma 0.07""" 
print re.findall(r'[0-9$.]+', s) 

출력 :

['0.10', '$5.00', '.05', '$25.00', '.35', '$12.5', '0.07'] 

더 엄격한 정규식 :

print re.findall(r'[$]?\d+(?:\.\d+)?', s) 

출력 :

['0.10', '$5.00', '$25.00', '$12.5', '0.07'] 

당신은 또한 .05를 일치 시키려면 :

print re.findall(r'[$]?(?:\d*\.\d+)|\d+', s) 

출력 :

['0.10', '$5.00', '.05', '$25.00', '.35', '$12.5', '0.07'] 
+1

'[$]'은 멋진 트릭이지만 기억해야 할 것입니다. – sircodesalot

1

음 기본 정규식 것 be : \$?\d+(\.\d+)?, 번호를 얻을 것이다. 불행히도, 나는 JavaScript/C#에서 정규 표현식을 사용하므로 파이썬에서 여러 줄을 어떻게 처리해야할지 모르겠습니다. 정말 간단한 깃발이되어야합니다.

+0

왜 끝에 '?'가 필요한지 설명 할 수 있습니까? –

+1

'?'아마도 그럴 것입니다. 아마 그렇지 않을 수도 있습니다. 예를 들어'spam '은'? '가's '다음에 오므로'spam '또는'spams '와 일치합니다. 그러나 그룹과 함께 사용할 경우 ('() '로 묶음) 그룹 전체에 적용됩니다. 그래서'(\. \ d +)? '는 숫자 뒤에 숫자가 오는 소수점이있는 경우 일치를 의미합니다. – sircodesalot

1

re.MULTILINE 플래그와 \n을 사용하여 줄 바꿈을 나타냅니다.

source = '''Sigma 0.10 index = $5.00 
beta .05=$25.00 
.35 index (or $12.5) 
Gamma 0.07''' 
import re 

# only handles two top lines; extend to taste 
rx = re.compile(
    'Sigma (\d*\.\d+) index = (\$\d*\.\d+)\nbeta (\d*\.\d+).*', 
    re.MULTILINE 
) 

print rx.search(source).groups() 
# prints ('0.10', '$5.00', '.05') 

은 라인과 몇 가지 간단한으로 정규 표현식의 사용, 하나 개의 당 결과 라인도 .split('\n') 고려하십시오.

+0

파싱하기 전에 입력을 분할하는 것은 정확성과 가독성 모두에 좋지 않은 아이디어처럼 보입니다. – siebz0r

+0

@ siebz0r : 분할은 소스 형식의 일부인 줄 바꿈을 구문 분석합니다. 내게 합법적 인 것 같아. – 9000