Python 将元组字符串转换为字符串元组

Python 将元组字符串转换为字符串元组,python,Python,我的意见是: input = ['(var1, )', '(var2,var3)'] 预期产出为: output = [('var1', ), ('var2','var3')] 在输入上迭代并在元组字符串上使用eval/literal\u eval是不可能的: >>> eval('(var1, )') >>> NameError: name 'var1' is not defined 如何将'(var1,)'等项转换为元组,其中内部对象被视为字符串而不是

我的意见是:

input = ['(var1, )', '(var2,var3)']
预期产出为:

output = [('var1', ), ('var2','var3')]
在输入上迭代并在元组字符串上使用
eval
/
literal\u eval
是不可能的:

>>> eval('(var1, )')
>>> NameError: name 'var1' is not defined
如何将
'(var1,)'
等项转换为元组,其中内部对象被视为字符串而不是变量

有没有比编写解析器或使用regex更简单的方法?

试试以下方法:

tuples = [tuple(filter(None, t.strip('()').strip().split(','))) for t in input]
例如:

In [16]: tuples = [tuple(filter(None, t.strip('()').strip().split(','))) for t in input]

In [17]: tuples
Out[17]: [('var1',), ('var2', 'var3')]

我们遍历元组字符串列表,对于每个元组字符串,删除
()
,然后按
将字符串拆分为一个列表,然后将列表转换回元组。我们使用删除空元素。

对于变量的每次出现,在符号表中搜索变量名称。可以提供自定义映射,该映射将为每个缺少的密钥返回密钥名称:

class FakeNamespace(dict):
    def __missing__(self, key):
        return key
例如:

In [38]: eval('(var1,)', FakeNamespace())
Out[38]: ('var1',)

In [39]: eval('(var2, var3)', FakeNamespace())
Out[39]: ('var2', 'var3')

注意:
eval
将当前全局文件复制到提交的
全局文件
字典中,如果它没有
\uuuuuu内置文件
。这意味着表达式将有权访问命名空间中的内置函数、异常和常量以及变量。您可以尝试通过传递
FakeNamespace(\uuu内置项)
来解决此问题,而不只是传递
FakeNamespace()
,但这不会使
eval
100%安全()

我喜欢Vault的解决方案。下面是另一个带有
ast.literal\u eval
re
的选项,如果
eval
不是选项:

>>> import re
>>> from ast import literal_eval
>>> [literal_eval(re.sub('(?<=\(|,)(\w+)(?=\)|,)', r'"\1"', x)) for x in input]
[('var1',), ('var2', 'var3')]
>>重新导入
>>>从ast导入文字值

>>>[literal_eval(re.sub)(?@MarounMaroun,它不象我解释的那样工作。在您提供的问题中,可以对浮点进行求值。像'var1'这样的字符串不能。
literal_eval
将抛出一个
ValueError:格式错误的字符串
很酷的方法!尽管使用
eval()时我们应该小心清理输入)
。如果两个字典都被更改,则无法访问(
)(或任何其他Python名称):
在[15]中:eval(“\uuuuuuuu内置”['zip']”),FakeGlobals())Out[15]:zip
eval(“\uuuu内置”['zip']”,FakeGlobals()),FakeGlobals()TypeError字符串索引必须是整数(对于上面的注释:该方法不是绝对的,但可能会减轻幼稚攻击)