如何将包含非逗号分隔值的列表的字符串转换为列表?

时间:2018-02-09 13:23:39

标签: python python-2.7

我是Python的新手,我想知道将"[1 2 3]"形式的字符串转换为列表的最优雅方法是什么?如果字符串包含以逗号分隔的值列表,那么解决方案很简单:

str = "['x', 'y', 'z']"
arr = eval(str)
print isinstance(arr, list) # True

但是,如果字符串中的列表不以逗号分隔,则此解决方案不起作用,例如, "['x' 'y' 'z']"

有没有一种常见的解决方法,而无需手动解析字符串?解决方案不应取决于类型,例如"[1 2 3]""['multiple words 1' 'multiple words 2']"都应正常转换。

2 个答案:

答案 0 :(得分:1)

import re

str = "[1 2 a 'multiple words 1' 'multiple words 2' 'x' 'y' 'z']"
print ([''.join(x) for x in re.findall("'(.*?)'|(\S+)", re.sub(r'^\[(.*)\]', r'\1', str))])
>>> ['1', '2', 'a', 'multiple words 1', 'multiple words 2', 'x', 'y', 'z']

第一个显而易见的步骤是摆脱[...]因为他们没有添加对结果有用的任何内容......

然后它起作用因为findall中的正则表达式:这只会匹配引号之间的任何内容或任何非空格序列。

我们自己不想要引号(或者我们是吗? - 它没有指定)所以正则表达式分组允许它只返回内部部分。

然后我们总是得到一对空元素和一对元素(('', '1')('', '2')等等),所以我们需要一个额外的清理循环。

此代码无法看到[1 2 3]['1' '2' '3']之间的区别,但这没有问题,因为问题中未指定此类变体。

答案 1 :(得分:1)

在这种情况下,shlex可能是一种解决方案。

import shlex

s = "['x' 'y' 'z']"
# First get rid of the opening and closing brackets
s = s.strip('[]')
# Split the string using shell-like syntax
lst = shlex.split(s)
print(type(lst), lst)

# Prints: <class 'list'> ['x', 'y', 'z']

但是你必须检查它是否符合你的要求。