2012-10-29 3 views
0

파이썬에서이 특정 정규식과 일치하는 데 문제가 있습니다. 누군가가 잘못된 것을 볼 수 있습니까?파이썬에서이 정규식 일치가 잘못되었습니다.

string = '[Pre-Avatar Mode Cost: 5.50 MP]' 
string = '[Pre-Avatar Mode Cost: 1.2 MP]' 
string = '[Pre-Avatar Mode Cost: 0.5 MP]' 
string = '[Post-Avatar Mode: 0 MP]' 

나는 다음을 시도하지만, 그들 모두와 일치하는 하나의 표현이있을 것 나던 : 나는 하나의 정규 표현식과 일치하는 것을 시도하고있다

샘플 문자열은

m = re.match('\[.*(?P<cost>\d+(\.\d+)).*\]', string) # Appears to match only ones with #.# 
m = re.match('\[.*(?P<cost>\d+(\.\d+)?).*\]', string) # Appears to match the 0 only, unable to print out m.groups for the others 

내가 (5.50, 1.2, 0.5, 0 등)을 잡으려고 노력하고는

첫 번째 .* 경기 비 욕심을해야
+0

문자열의 어느 부분을 찾으시겠습니까? –

+1

당신은'string = "[Pre-Avatar Mode Cost : 5.50MP]"'m = re.match ('[. * (? P \ d + (\. \ d +)]와 같은 재현 가능한 예제를 제공해야합니다.). * \] ', string)' –

+0

':'와 공백 문자가 누락 된 것 같습니다. –

답변

2

(A추가), 그것은 그렇지 않으면 번호를 삼키는 것 :

r'\[.*?(?P<cost>\d+(?:\.\d+)?).*\]' 

을 나는 또한 옵션 .number 부분을 출력 처리를 단순화 할 수있는 비 캡처 그룹을 만들었어요 :

>>> import re 
>>> costre = re.compile(r'\[.*?(?P<cost>\d+(?:\.\d+)?).*\]') 
>>> costre.match('[Post-Avatar Mode: 0 MP]').groups() 
('0',) 
>>> costre.match('[Post-Avatar Mode: 5.50 MP]').groups() 
('5.50',) 
>>> costre.match('[Post-Avatar Mode: 1.2 MP]').groups() 
('1.2',) 
1

내가 사용하는 것이 좋습니다 것 :을 앵커로 사용합니다. 당신은 심지어는 텍스트로 보장된다 경우 MP 접미사에 추가 할 수 있습니다

r'\[.*: (?P<cost>\d+(?:\.\d+)?).*\]' 

: 그런 식으로, 당신은 더 강력한 표현을 얻을.

관련 문제