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

2024-04-20 13:54:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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']"都应正常转换。你知道吗


Tags: 方法字符串列表eval解决方案multiple形式list
2条回答
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中的正则表达式,它可以工作:它只匹配引号之间的任何内容或任何非空格序列。你知道吗

我们不想要引用本身(或者我们?–它没有指定),所以regex分组允许它只返回内部部分。你知道吗

然后我们总是得到一个空元素和一个填充元素的成对(('', '1')('', '2')等等),所以我们需要一个额外的清洗循环。你知道吗

这段代码看不到[1 2 3]['1' '2' '3']之间的区别,但这不是问题,因为问题中没有指定这样的变量。你知道吗

在这种情况下,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']

但你得检查它是否符合你的要求。你知道吗

相关问题 更多 >