我试图找到一种方法将以下字符串解析为使用正则表达式的字符串列表。
{"first_statement" : 1, "bleh" : { "some_data" : True } }, {"second_statement" : 2}
# Group 1:
{"first_statement" : 1, "bleh" : { "some_data" : True } }
# Group 2:
{"second_statement" : 2}
我希望我的正则表达式匹配最外部的括号模式,无论有多少内部括号。例如......
{"first_statement" : 1, "bleh" : { "some_data" : True, "foo" : { "bar" : { "zing" : False } } } }
# Group 1:
{"first_statement" : 1, "bleh" : { "some_data" : True, "foo" : { "bar" : { "zing" : False } } } }
我对正则表达式没有多少经验,但我尝试了一些东西,我得到的更接近的是一个简单的模式... {.*?}
,但它显然在我第一次遇到关闭括号。在那之前,我所有的其他尝试都失败了,我得到的距离越近.NET regex solution,但我无法让它在python上运行。
有没有办法使用python正则表达式,或者我是否必须使用简单的循环逐字符解析我的字符串?据我研究探索regex101的All tokens,没有简单的方法来实现这一点。
注意:我不在乎第一层牙箍之间的角色。我想忽略它们。
答案 0 :(得分:1)
没有正则表达式的一种方法是使用ast.literal_eval
:
from ast import literal_eval
mystr = '{"first_statement" : 1, "bleh" : { "some_data" : True } },
{"second_statement" : 2}'
lst = list(map(str, literal_eval('['+mystr+']')))
# ["{'first_statement': 1, 'bleh': {'some_data': True}}",
# "{'second_statement': 2}"]
答案 1 :(得分:0)
对于特殊情况,你的字符串是一个几乎合法的JSON字符串,只缺少周围的大括号(这似乎就是这里的情况),你可以添加大括号并尝试将其解析为JSON字符串:
import json
s = '{"first_statement" : 1, "bleh" : { "some_data" : "True" } }, {"second_statement" : 2}'
try:
x = json.loads('[' + s + ']')
except json.JSONDecodeError:
# do something?
x = None
print(x)
# [{'bleh': {'some_data': 'True'}, 'first_statement': 1},
# {'second_statement': 2}]
这类似于添加大括号并使用ast.literal_eval
解析它,正如@jpp中his answer所建议的那样,但对它接受的内容会更严格(因为字符串需要是一个合法的JSON字符串,除了缺少列表大括号)。请注意,我需要在True
周围添加引号,以实现此目的。