2012-08-28 43 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

相关问题