使用python将字符串转换为字典

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

谢谢

aba*_*ert 6

首先,如果您从字典(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_eval2.6的源代码ast.py,但这有点麻烦.ActiveState中也有一些配方,例如http://code.activestate.com/recipes/364469/,虽然不相同literal_eval,但可能适合您的用途.

这仍然不会起作用,因为您还缺少示例字符串中的右侧右括号.我希望这是一个错字,在这种情况下,没有问题.

如果没有,您需要解释您希望它对这些情况实际做些什么.也许自动关闭任何未闭合的括号?如果是这样,未公开的括号是否也有问题?

  • 我认为`json`模块直到2.6才引入,更可惜. (2认同)