python字典从字符串转换?

时间:2010-05-07 08:51:33

标签: python serialization eval yaml dictionary

如果我像

那样串起来
"{ partner_name = test_partner}" OR " { partner_name : test_partner }

它的示例字符串非常复杂,包括几个特殊字符,如=,[,],{,}

将它转换为python对象的最佳方法是什么 - 所以我可以处理它

我尝试使用eval,但它需要“'”作为字符串,但是如何在开始和结束每个单词之前添加这个特殊字符,我尝试了常规表达re.findal('\ w +')但它失败了当我的字符串包含'_'或类似的字符时,因为它会将字符串分隔为'_'

这个问题的对象是我的应用程序需求,用户友好的语言作为输入 - 我认为Json Dict会很好 - 但是用户很难在每个字符串前后加上“'”......

然后我想为yaml但它也很复杂,如果有人可以建议更好的用户友好输入我用作python对象 - 那么请帮助我。

5 个答案:

答案 0 :(得分:3)

如果YAML对于您的用户来说过于复杂,您应该考虑为他们提供结构化输入表单并从那里正确格式化数据。对于指定结构,YAML非常容易编写,当然比花括号语法更容易。

答案 1 :(得分:1)

修复输入将是最佳解决方案。

但是你可以跳过一系列的箍,试图通过json输入parsable。这很脆弱,因为你的输入不是json,并且分歧输入可能很容易打破这一点(尽管它仍然优于eval的平淡使用。)

>>> import json
>>> s = '{ partner_name = test_partner}'
>>> t = s.replace(' ', '') # strip whitespace
>>> t = t.replace('=', '":"')
>>> t = t.replace('{','{"')
>>> t = t.replace('}','"}')
>>> json.loads(t)
{u'partner_name': u'test_partner'}

答案 2 :(得分:1)

如果是外部数据,请不要使用eval()!如果要正确解析它,请查看一些解析库。使用解析组合器的那些非常好 - 例如https://github.com/pyparsing/pyparsing或者可能是一个peg解析器:http://fdik.org/pyPEG/

答案 3 :(得分:0)

>>> import ast

>>> ast.literal_eval("{ 'partner_name' : 'test_partner' }")
{'partner_name': 'test_partner'}

copied from

修改

您可以使用regular expressions

>>> import re
>>> m = re.match(r"(?P<partner_name>\w+) = (?P<test_partner>\w+)", "foo = bar")
>>> m.groupdict()
{'partner_name': 'foo', 'test_partner': 'bar'}
>>> 

答案 4 :(得分:0)

您可以替换或删除任何不需要的字符

>>> s
'{ partner_name = test_partner }'
>>> s = ''.join([c for c in s.replace('=', ':') if not c in '\ {}'])
>>> s
'partner_name:test_partner'

然后将字符串拆分为两个以创建一个字典

>>> dict([s.split(':')])
{'partner_name': 'test_partner'}

或更新

>>> your_dict.update([s.split(':')])