est*_*oza 1 python parsing converter python-2.5
我知道这个问题听起来很复杂,但事实并非如此,至少看了一会儿,我对于我的具体问题我也无能为力.
我有以下字符串:
"{first : {name : 'test', value : 100}, second : {name : 'test2', value : 50}}"
Run Code Online (Sandbox Code Playgroud)
我想将该字符串转换为字典,如下所示:
{'first': {'name': 'test', 'value' : 100}, 'second': {'name': 'test2', 'value' : 50}}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我正在使用Python 2.5
谢谢
首先,如果您从字典(Python或几乎任何其他语言)生成这些字符串,您可能需要考虑以易于解析的方式生成它们.例如,在Python中.要么repr(d)
或json.dumps(d)
将给你一些非常类似于你现有的字符串,但有适当的引号.
但是,如果你刚刚收到别人给你的一堆乱七八糟的字符串,那么最简单的方法就是将它正则化为一个实际的JSON字符串,这样你就可以解析它:
json.loads(re.sub(r",\s*(\w+)", r", '\1'",
re.sub(r"\s*\{\s*(\w+)", r"{'\1'", x)).replace("'", '"'))
Run Code Online (Sandbox Code Playgroud)
在2.5中,没有内置json
模块,所以你可能想要pip install simplejson
,然后你可以这样做:
try:
import json
except ImportError:
import simplejson as json
Run Code Online (Sandbox Code Playgroud)
(或者,当然simplejson
,如果您愿意,您可以无条件地要求.)
另一种选择是使用ast.literal_eval
而不是json.loads
.哪一个是合适的取决于有关您的字符串的更多信息.JSON比Python语法更受限制,所以如果你担心输入的来源会更安全,但如果你的输入可能合法地拥有JSON无法处理的东西,那就更灵活了1+3j
.
然而,像json
,ast
是新的2.6,而且也没有直接替代PyPI上可用.幸运的是,2.5 确实有_ast
模块,你可以只复制和粘贴literal_eval
2.6的源代码ast.py
,但这有点麻烦.ActiveState中也有一些配方,例如http://code.activestate.com/recipes/364469/,虽然不相同literal_eval
,但可能适合您的用途.
这仍然不会起作用,因为您还缺少示例字符串中的右侧右括号.我希望这是一个错字,在这种情况下,没有问题.
如果没有,您需要解释您希望它对这些情况实际做些什么.也许自动关闭任何未闭合的括号?如果是这样,未公开的括号是否也有问题?