2013-09-26 32 views
0

我的代碼如下錯誤的時刻,前三個例子工作正常,但最後一個不工作,因爲它應該。需要幫助改變一個正則表達式,使其正確拆分

我已經評論過來顯示輸出是什麼以及它應該是什麼。

import re 

print(filter(None, re.split(r'(\d+) (\w.*) (\d.*)', '6 Name 100/100'))) 
#['6', 'Name' '100/100'] 
## Correct 

print(filter(None, re.split(r'(\d+) (\w.*) (\d.*)', '6 Name Name-Name 1/1001'))) 
#['6', 'Name Name-Name', '1/1001'] 
## Correct 

print(filter(None, re.split(r'(\d+) (\w.*) (\d.*)', '6 Name Name`Name 1240/1422'))) 
#['6', 'Name Name`Name', '1240/1422'] 
## Correct 

print(filter(None, re.split(r'(\d+) (\w.*) (\d.*)', '6 Name Name`Name None'))) 
#['6', 'Name Name`Name None'] 
## Wrong, It should be returning: 
#['6', 'Name Name`Name', 'None'] 

任何想法都歡迎。

謝謝 - HYFLEX

+0

你究竟想要做什麼? – Jerry

+0

@Jerry試圖用正則表達式將字符串分成3部分... – Ryflex

回答

4

看起來你試圖獲得一個列表並將空間看作分隔符,你似乎想要得到第一個和最後一個元素,然後所有剩下的元素都會到達結果列表的第二個元素。

如果這是這樣,你可以用比賽來代替:

>>> print re.match(r'^(\S+) (.*?) (\S+)$', '6 Name Name`Name None').groups() 
('6', 'Name Name`Name', 'None') 

regex101 demo

\S比賽的每一個字符不是一個空格,^$分別匹配開頭和行尾。

1

所以*是一個貪婪的量詞,並會繼續下去,直到它可以去不再。所以你需要添加一個?它

(\d+) (\w.*?) (\d.*) 

後還沒有\d到您的前綴爲.*最後一組。

+0

你甚至測試過這個正則表達式嗎? – Jerry

+0

不,我現在正在做它 –

+0

它仍然不工作,因爲'*'通配符仍然是貪婪? :/ – Ryflex