2011-10-24 211 views
9

當使用Python字符串函數split()時,是否有人有一個漂亮的技巧來將由雙引號括起來的項目視爲非分裂字詞?不要用Python字符串split()分割雙引號的單詞嗎?

說我想拆只有空白,我有這樣的:

>>> myStr = 'A B\t"C" DE "FE"\t\t"GH I JK L" "" ""\t"O P Q" R' 
>>> myStr.split() 
['A', 'B', '"C"', 'DE', '"FE"', '"GH', 'I', 'JK', 'L"', '""', '""', '"O', 'P', 'Q"', 'R'] 

我想對待雙引號內的任何一個單一的詞,即使空格嵌入,這樣會喜歡用下面落得:

['A', 'B', 'C', 'DE', 'FE', 'GH I JK L', '', '', 'O P Q', 'R'] 

,或者至少這一點,然後我會去掉雙引號:

['A', 'B', '"C"', 'DE', '"FE"', '"GH I JK L"', '""', '""', '"O P Q"', 'R'] 

任何非正則表達式的建議?

回答

30

你贏了。「T能夠得到與str.split()這種行爲如果你可以用相當複雜的解析它(就像忽略一個反斜槓前面雙引號)居住,shlex.split()可能是你正在尋找:

>>> shlex.split(myStr) 
['A', 'B', 'C', 'DE', 'FE', 'GH I JK L', '', '', 'O P Q', 'R'] 
+2

+100,哇,從來沒有聽說過shlex –

+1

謝謝謝恩---這正是我所期待的! – Rob

+0

真棒,非常有幫助。謝謝! – liang

0

我建議你re的模式搜索「[^」] *」和適用string.split只對剩餘部分,你可以實現一個處理所有相關的字符串部分遞歸函數。

1

@Rob:爲什麼沒有正則表達式,如果正則表達式的解決方案如此簡單?

my_str = 'A B\t"C" DE "FE"\t\t"GH I JK L" "" ""\t"O P Q" R' 
print re.findall(r'(\w+|".*?")', my_str) 
['A', 'B', '"C"', 'DE', '"FE"', '"GH I JK L"', '""', '""', '"O P Q"', 'R'] 
+0

+1非常好的解決方案! – hochl

+0

@PabloG - 儘管經常是前期簡單的解決方案,但我還沒有親自遇到過正則表達式沒有更多長期成本的情況。 至於這個特定的情況,我非常確定這是一個解決的問題,我只是可以找到它 - 看起來斯文指着我用正確的方向。 – Rob

相關問題