【问题标题】:best pythonic way to parse param string?解析参数字符串的最佳pythonic方法?
【发布时间】:2012-08-28 06:09:09
【问题描述】:

从某处接收一个字符串,该字符串是一系列参数。参数由空格分隔。任务是将字符串解析为参数列表,所有参数都是字符串类型。

例如:

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']

python 有没有优雅的方式来完成这项工作?

附言。我不认为正则表达式可以解决这个问题。

【问题讨论】:

  • csv 模块使用带有空格分隔的方言?
  • 您的最后一个输入字符串在反斜杠方面有点偏离;纠正它会帮助你快速得到正确的答案。
  • “优雅的解析器”和“垃圾数据”不能并存

标签: python string parsing


【解决方案1】:

使用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 实例转换回列表即可拆分输入。

【讨论】:

    猜你喜欢
    • 2016-06-18
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多