0

我有一个如下字符串:

{"url":"<a href="http://www.blah.com/blah/blah"> click here </a>"}

我想将字符串转换为字典,但问题是,当我使用 eval() 时,它失败了。

>>> s = r'{"url":"<a href="http://www.blah.com/blah/blah"> click here </a>"}'
>>> d = eval(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    {"url":"<a href="http://www.blah.com/blah/blah"> click here </a>"}
                    ^
SyntaxError: invalid syntax

给定上面的例子,有没有办法将字符串 s 转换成字典,这样我就可以通过引用 d['url'] 来访问 url 的值

4

3 回答 3

3

你不走运,因为从你所说的下面的字符串是模棱两可的:

{ "url": "<a href="," foo=": "/>" }

那应该是映射"url""<a href="" foo"的字典"/>",还是应该是映射到具有属性和"url"的(自闭合)<a>标签的字典?例如,您可以通过不允许值包含不平衡字符来决定,但这很麻烦,即使那时我也不确定是否存在模棱两可的例子。href=","foo=": "<

确实,您需要在 HTML 中的引号与类似字典的内容粘在一起之前对其进行转义。这样,就不会有两个不同的字典都由同一个字符串表示。

例如:

>>> repr({ "url" : '<a href="http://www.blah.com/blah/blah"> click here </a>' })
'{\'url\': \'<a href="http://www.blah.com/blah/blah"> click here </a>\'}'
于 2013-09-21T01:00:01.247 回答
0

您可能可以使用简单的正则表达式或自定义解析,并在 eval 之前将内部“替换为 \”,如下所示:

s = r'{"url":"<a href=\"http://www.blah.com/blah/blah\"> click here </a>"}'
d = eval(s)
>>>d
{'url': '<a href="http://www.blah.com/blah/blah"> click here </a>'}
于 2013-09-21T00:05:36.573 回答
0

您可以使用三引号来进行“精确”引用。

""" stuff """

所以如果你有类似的东西She said, "Lo, and behold, a viper hath appeared!" And it was so!"但你想引用它,你可以把它放在三引号中,它会在引号中作为句子的一部分阅读而不会出错。

但是,上述内容似乎并没有实际帮助,而且我误解了您的问题。相反,我建议您使用正则表达式分析此输入({(.*?):(.*?)}可能有效。)如果它是输入,或者如果您的代码生成字符串,则更改您之前的代码。

如果您确实使用此正则表达式,那么 group(1) 将是键,而 group(2) 将是值,正如您所知。(当然,group(0) 是整个字符串)

于 2013-09-20T23:34:35.127 回答