如果我像
那样串起来"{ partner_name = test_partner}" OR " { partner_name : test_partner }
它的示例字符串非常复杂,包括几个特殊字符,如=,[,],{,}
将它转换为python对象的最佳方法是什么 - 所以我可以处理它
我尝试使用eval,但它需要“'”作为字符串,但是如何在开始和结束每个单词之前添加这个特殊字符,我尝试了常规表达re.findal('\ w +')但它失败了当我的字符串包含'_'或类似的字符时,因为它会将字符串分隔为'_'
这个问题的对象是我的应用程序需求,用户友好的语言作为输入 - 我认为Json Dict会很好 - 但是用户很难在每个字符串前后加上“'”......
然后我想为yaml但它也很复杂,如果有人可以建议更好的用户友好输入我用作python对象 - 那么请帮助我。
答案 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'}
修改强>
您可以使用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(':')])