我有一个包含有效Python字典的字符串
data = "Some string created {'Foo': u'1002803', 'Bar': 'value'} string continue etc."
我需要提取那个字典。我尝试使用正则表达式,但是由于某种原因 re.search(r"\{(.*?)\}", data)
没有起作用。有没有更好的方法来提取这个字典?
我有一个包含有效Python字典的字符串
data = "Some string created {'Foo': u'1002803', 'Bar': 'value'} string continue etc."
我需要提取那个字典。我尝试使用正则表达式,但是由于某种原因 re.search(r"\{(.*?)\}", data)
没有起作用。有没有更好的方法来提取这个字典?
根据 @AChampion 的建议。
>>> import re
>>> import ast
>>> x = ast.literal_eval(re.search('({.+})', data).group(0))
>>> x
{'Bar': 'value', 'Foo': '1002803'}
所以你要查找的模式是re.search('({.+})', data)
你应该使用该字符串提取花括号,这样ast.literal_eval
可以将字符串转换为Python字典。另外,由于{
或}
在捕获组中以字面形式匹配,因此你不需要r
前缀。
dict
的情况下仍然有效,例如:"Some string created {'Foo': u'1002803', 'Bar': 'value', 'Baz': {1:2, 3:4}} string continue etc."。但是,如果字符串中有不止一个独立的dict
,则会失败。例如:"Some string created {'Foo': u'1002803', 'Bar': 'value'} string continue etc. Another dict: {1:2, 3:4}"。需要使用解析器来处理后一种情况(或者如果在字符串中其他地方可能出现{
或}
)。 - jpmc26re.findall(r'{.+?}', data)
)可以处理额外的 {}
出现。但是,这样会使嵌套字典出现问题,因为它们被视为不同的出现,而实际上它们是大型组的一部分。因此,实际上需要解析器来同时处理这两种情况。 - danidee'name: "data dict" id: 2\nv6: false\nstats {\n hosts {\n cnt1: 256\n cnt2: 0\n }\n groups {\n cnt1: 1\n cnt2: 0\n }\n critical {\n cnt1: 1\n cnt2: 0\n }\n main_hosts {\n cnt1: 256\n cnt2: 0\n }\n}\n group_id: "None"'
我该如何从中获取一个字典列表的字典?stats {hosts: {cnt1: 250, cnt2: 0}, groups: {cnt: 1, cnt2: 0}, 等等,等等}
- PixelatedPixieeval
的更好方法来解析字典:import re
import json
data = "Some string created {'Foo': '1002803', 'Bar': 'value'} string continue"
dict_object = json.loads(re.search('({.+})', data).group(0).replace("'", '"'))
如果要解析的字典包含Unicode字符串值(参考问题中的示例字符串):
dict_object = json.loads(re.search('({.+})', data).group(0).replace("u'", '"').replace("'", '"'))
u
会导致解析错误,应在答案中提到它。 - Matthew Barloweu
。 - Matthew Barlowejson.loads
是更安全和更好的处理方式,但应该能够处理OP的输入。评论已删除并点赞。 - Matthew Barlowe你的解决方案可行!
In [1]: import re
In [2]: data = "Some string created {'Foo': u'1002803', 'Bar': 'value'} string continue etc."
In [3]: a = eval(re.search(r"\{(.*?)\}", data).group(0))
In [4]: a
Out[4]: {'Bar': 'value', 'Foo': u'1002803'}
eval
。-1 - jpmc26