2012-08-28 78 views
2

從某處接收字符串,該字符串是一個params序列。 Params由空白分隔。任務將字符串解析爲參數列表,所有參數都是字符串類型。解析參數字符串的最佳pythonic方式?

例如:

input : "3 45 5.5 a bc" 
output : ["3","45","5.5","a","bc"] 

事情變得有點複雜,如果需要傳輸的字符串包含空格,使用"引用。

input: "3 45 5.5 \"This is a sentence.\" bc" 
output: ["3","45","5.5","This is a sentence.","bc"] 

但是如果句子碰巧包含一個引號?使用轉義字符:\" - >"\\ - >\

input: "3 45 5.5 \"\\\"Yes\\\\No?\\\" it said.\" bc" 
output: ['3','45','5.5','"Yes\\NO?" it said.','bc'] 

巨蟒是否有一個優雅的方式做這個工作?

PS。我不認爲正則表達式可以解決這個問題。

+2

[csv](http://docs.python.org/library/csv.html)模塊使用帶有空格分隔的方言嗎? –

+0

你的最後一個輸入字符串對於反斜槓有點偏離;糾正它會幫助你快速得到正確的答案。 –

+2

「優雅的語法分析器」和「垃圾數據」並排不好 –

回答

8

使用shlex.split() function

>>> import shlex 
>>> shlex.split("3 45 5.5 a bc") 
['3', '45', '5.5', 'a', 'bc'] 
>>> shlex.split("3 45 5.5 \"This is a sentence.\" bc") 
['3', '45', '5.5', 'This is a sentence.', 'bc'] 
>>> shlex.split("3 45 5.5 \"\\\"Yes\\\\No?\\\" it said.\" bc") 
['3', '45', '5.5', '"Yes\\No?" it said.', 'bc'] 

您可以創建一個自定義分析器與shlex.shlex function,然後改變它的行爲,通過設置其屬性。例如,您可以將.whitespace屬性設置爲', \t\r\n'以允許使用逗號來分隔單詞。然後只需將shlex實例轉換回列表以拆分輸入。

+0

這個工作得很好!謝謝! – Max

相關問題