如何将字符串转换为Python字典?
如果我有这样的字符串:
"{ partner_name = test_partner}" OR " { partner_name : test_partner }
这是一个例子字符串,里面会有很多复杂的特殊字符,比如 =、[、]、{、}。
我想知道把它转换成 Python 对象的最佳方法,这样我就可以处理它了。
我试过用 eval,但它要求字符串要用 " ' " 包起来,但我该怎么在每个单词的开头和结尾加上这个特殊字符 \' 呢?我试过用正则表达式 re.findal('\w+'),但当我的字符串里有 ' _ ' 或类似的字符时,它就会把字符串按 ' _ ' 分开,这样就不行了。
我问这个问题的原因是我的应用需要用户友好的输入语言,我觉得用 JSON 字典会不错,但用户懒得在每个字符串前后加上 " ' "……
然后我想到了 YAML,但这也很复杂。如果有人能建议一种更用户友好的输入方式,让我可以用它作为 Python 对象,那就太好了。
5 个回答
1
如果你处理的是外部数据,千万不要用 eval()
!如果你想正确地解析这些数据,可以看看一些解析库。使用解析组合子的库非常不错,比如这个 https://github.com/pyparsing/pyparsing。或者你也可以试试 peg 解析器:http://fdik.org/pyPEG/
1
修正输入内容是最好的解决办法。
不过,你也可以尝试一些复杂的方法,让输入内容能够被 json 解析。这种方法比较脆弱,因为你的输入并不是完全符合 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'}
3
如果YAML对你的用户来说太复杂了,或许你可以考虑给他们一个结构化的输入表单,这样可以从表单中正确地格式化数据。其实,YAML写起来已经尽量简单了,用来指定结构时,确实比大括号的语法要简单得多。