2012-03-22 36 views
3
>>> ".a string".split('.') 
['', 'a string'] 

>>> "a .string".split('.') 
['a ', 'string'] 

>>> "a string.".split('.') 
['a string', ''] 

>>> "a ... string".split('.') 
['a ', '', '', ' string'] 

>>> "a ..string".split('.') 
['a ', '', 'string'] 

>>> 'this is a test'.split(' ') 
['this', '', 'is', 'a', 'test'] 

>>> 'this is a test'.split() 
['this', 'is', 'a', 'test'] 

爲什麼split()split(' ')不同?當被調用的字符串只有空格作爲空格時?是python str.split()不一致嗎?

爲什麼split('.')分裂"..."['','']split()不考慮兩個分隔符之間的空白字...

文檔很清楚(請參閱下面的@agf),但我想知道爲什麼選擇這種行爲。

我已經看過源代碼(here),以爲行136應該只是小於:... i < str_len ...

回答

12

str.split docs,這種行爲是特別提到:

如果給出sep,則連續分隔符不會分組在一起,並且 被視爲分隔空字符串(例如,'1,,2'.split(',') 返回['1', '', '2'])。 sep參數可能包含多個 字符(例如,'1<>2<>3'.split('<>')返回['1', '2', '3'])。用指定的分隔符分割空字符串將返回 ['']

如果sep未指定或None不同分裂算法是 施加:連續的空白的運行被視爲單一 分離器,結果將不包含空字符串在開始 或者如果結束字符串具有前導空格或尾隨空格。因此, 將空白字符串或僅包含空格 的字符串與None分隔符分開,將返回[]

Python試圖做你所期望的。大多數人沒有想到太難可能會想到

'1 2 3 4 '.split() 

返回

['1', '2', '3', '4'] 

回想一下空格都被用來代替選項卡來創建固定寬度的列分割數據 - 如果數據是不同的寬度,每行中將有不同數量的空格。

行尾通常會出現尾隨空白,而且默認情況下也會忽略它 - 它會給出您所期望的答案。

當它來到時指定一個分隔符所使用的算法,想想在一個CSV文件中的一行:

1,,3 

意味着在第一和第三列中的數據,並沒有在第二,所以你會希望

'1,,3'.split(',') 

返回

['1', '', '3'] 

否則你將無法到t每個字符串來自哪一列。

+0

是的。我已經看到了這一點,並會增加這個問題。你知道爲什麼這是選擇的行爲?這種行爲的一些應用/案例? – ijverig 2012-03-22 05:51:05

+1

@ijverig我已經給我的答案添加了一個基本原理。 – agf 2012-03-22 05:54:34

+0

我同意你的意見。什麼讓我感興趣的是當分隔符被指定時split('sep')'不會做「人們所期望的」。在連續分隔符之間返回空字符串對我來說也很奇怪。我想知道這是否用於某些流行的特定情況。無論如何,謝謝你的幫助! – ijverig 2012-03-22 06:01:49