2010-04-23 83 views
1

如何匹配空格分隔的單詞列表,後跟空格和一些可選數字? 我有這樣的:正則表達式:匹配空格連接的單詞列表,排除最後一個空格

>>> 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 2010-04-23 15:05:25

相關問題