2016-04-29 60 views
1

我需要將一系列字符串拆分爲由空格表示的3個組件部分。這些字符串有時包含子列表,但始終作爲字符串的最後一個組件。Python Shlex與括號拆分

我之前使用Shlex取得了巨大成功,但我沒有得到預期的結果,因爲我最近的子列表包含他們自己的空間,而且似乎將Shlex關閉。

是否有替代Shlex的可能更好地執行任務?

是一些例子:

'BREAKFAST IN ["Rolled Oats","Cornflakes","French Toast"]' 

COPIES_FOR_EXTERNAL > "0" 

應該變成像列表:

['BREAKFAST','IN', '["Rolled Oats","Cornflakes","French Toast"]'] 

['COPIES_FOR_EXTERNAL','>','"0"'] 
+0

shlex做殼狀的解析。你得到的結果是,一個shell將會做什麼(因爲涉及分詞行爲)。也就是說,你想要的行爲遠遠超出其預期的用例和規範。 –

+0

是的,這就是我的想法,雖然在增加複雜性之前它做得很好。我想正則表達式可能是最好的解決方案。 – danspants

+0

個人而言,我傾向於在「構建一個真正的解析器」陣營。當然,這是更多的工作和更多的代碼,但是你從中得到的東西是更加嚴格定義的(並且能夠處理上下文規則變化以及需要在正則表達式中處理hackery的其他異常)。 –

回答

1

既然你知道部件的數目和子表始終是最後一個元素,你可以使用str.splitmaxsplit參數:

s1 = 'BREAKFAST IN ["Rolled Oats","Cornflakes","French Toast"]' 
s2 = 'COPIES_FOR_EXTERNAL > "0"' 

print s1.split(None, 2) # ['BREAKFAST', 'IN', '["Rolled Oats","Cornflakes","French Toast"]'] 
print s2.split(None, 2) # ['COPIES_FOR_EXTERNAL', '>', '"0"'] 
+0

如此明顯。當然,我很擔心原始開發者爲什麼會使用Shlex ......他知道我沒有......我相信未來會有一些醜陋的頭腦,但在那之前這將會成功! – danspants