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字符串索引必须是整数(对于上面的注释:该方法不是绝对的,但可能会减轻幼稚攻击)