2010-04-23 4 views
1

공백으로 구분 된 단어 목록과 공백 문자 및 일부 선택적 숫자를 어떻게 일치 시키나요?Regex : 마지막 공백을 제외하고 공백 문자로 된 단어 목록 일치

>>> import re 
>>> m = re.match('(?P<words>(\S+\s+)+)(?P<num>\d+)?\r\n', 'Foo Bar 12345\r\n') 
>>> m.groupdict() 
{'num': '12345', 'words': 'Foo Bar '} 

내가 마지막 공백 (들)을 포함하지 않도록 단어 그룹을 싶습니다하지만이 일을 알아낼 수 없습니다 : 나는이 있습니다. 나는 결과에 .strip()를 할 수도 있지만 그만큼 재미 :)


일부 문자열을 테스트하고이 아니다 결과 원 : 나는 조금 해요

'Foo & Bar 555\r\n' => {'num': '555', 'words': 'Foo & Bar'} 

'Hello World\r\n' => {'num': None, 'words': 'Hello World'} 

'Spam  99\r\n' => {'num': 99, 'words': 'Spam'} 

'Number 1 666\r\n' => {'num': 666, 'words': 'Number 1'} 

답변

2

을 귀하의 이중 캡처 그룹에 의해 혼란스러워하고, \w을 사용하고 있지만 &과 같은 단어가 아닌 문자 (예 : \S, 공백이 아님, \w ...을 말하고있는 것일 수 있습니다.)와 일치시키고 싶지 만, 어쩌면 ... :

>>> import re 
>>> r = re.compile(r'(?P<words>\w+(?:\s+\S+)*?)\s*(?P<num>\d+)?\r\n') 
>>> for s in ('Foo & Bar 555\r\n', 'Hello World\r\n', 'Spam  99\r\n', 
...   'Number 1 666\r\n'): 
... print s, r.match(s).groupdict() 
... 
Foo & Bar 555 
{'num': '555', 'words': 'Foo & Bar'} 
Hello World 
{'num': None, 'words': 'Hello World'} 
Spam  99 
{'num': '99', 'words': 'Spam'} 
Number 1 666 
{'num': '666', 'words': 'Number 1'} 
>>> 
+0

그래, 나는 '&'와도 매치시키고 싶다. 혼란에 대해 미안하다. – Jesper

관련 문제