Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带括号的Python-Shlex拆分_Python_String_Shlex - Fatal编程技术网

带括号的Python-Shlex拆分

带括号的Python-Shlex拆分,python,string,shlex,Python,String,Shlex,我需要将一系列字符串拆分为3个由空格表示的组成部分。这些字符串有时包含子列表,但始终作为字符串的最后一个组件 我以前使用Shlex取得了巨大的成功,但我不再得到期望的结果,因为我最近的子列表包含了它们自己的空格,这似乎使Shlex失去了作用 有没有替代Shlex的方法可以更好地执行任务 例如: 'BREAKFAST IN ["Rolled Oats","Cornflakes","French Toast"]' 及 应该成为如下列表: ['BREAKFAST','IN', '["Rolled O

我需要将一系列字符串拆分为3个由空格表示的组成部分。这些字符串有时包含子列表,但始终作为字符串的最后一个组件

我以前使用Shlex取得了巨大的成功,但我不再得到期望的结果,因为我最近的子列表包含了它们自己的空格,这似乎使Shlex失去了作用

有没有替代Shlex的方法可以更好地执行任务

例如:

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

应该成为如下列表:

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


由于您知道组件的数量,并且子列表始终是最后一个元素,因此可以与
maxspilt
参数一起使用:

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

shlex执行类似shell的解析。你得到的结果是,一个shell会做什么(就分词行为而言)。也就是说,你想从它那里得到的行为远远超出了它的预期用例和规范。是的,这就是我想的,尽管它在增加复杂性之前做得很好。我认为正则表达式可能是最好的解决方案。就我个人而言,我倾向于“构建一个真正的解析器”阵营。当然,这需要更多的工作和更多的代码,但您从中得到的定义要严格得多(并且能够处理上下文规则更改和其他需要在正则表达式中处理黑客行为的异常情况)。。。。有一个庞大的解析器生成器列表;就我个人而言,如果今天在Python中开始一些新的东西,而不需要以这种或那种方式驱动事情,我可能会同意。太明显了。现在我当然担心为什么最初的开发人员使用Shlex。。。他知道什么我不知道。。。我相信将来会有什么东西出现在它丑陋的脑袋上,但在那之前,这会起作用的!
['COPIES_FOR_EXTERNAL','>','"0"']
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"']