我是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']"
都应正常转换。
答案 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']
但是你必须检查它是否符合你的要求。