Python Reg ex解析带有括号嵌套子列表的列表?
我正在尝试重构一些Python代码,这些代码以以下格式解析字符串:Python Reg ex解析带有括号嵌套子列表的列表?,python,regex,Python,Regex,我正在尝试重构一些Python代码,这些代码以以下格式解析字符串: 东西1、东西2、东西3[东西31、东西32、东西34[东西341]、东西5 其中,最终结果是结构化结果,如: { "thing_1": True, "thing_2": True, "thing_3": { "thing_31": True, "thing_32": True, "thing_34: { "thing_341": True }
东西1、东西2、东西3[东西31、东西32、东西34[东西341]、东西5
其中,最终结果是结构化结果,如:
{
"thing_1": True,
"thing_2": True,
"thing_3": {
"thing_31": True,
"thing_32": True,
"thing_34: {
"thing_341": True
}
},
"thing_5": True,
}
实际上,这是API请求的字段列表(其中仅返回给定字段),支持为嵌套对象定义所需字段
我一直在尝试各种方法来编写regex(如果可能的话)。我的想法是首先对括号中的内容进行解析,同时保留每个括号前的第一个元素,最后只剩下最外层的顶级列表。但事实证明,用正则表达式描述这一点比用英语“说”要困难得多
下面是一些值得注意的尝试,但分组都是错误的
([a-z0-9\]+)(\[[a-z0-9,\*]+\]*)+)
([a-z0-9\]+)(\[[a-z0-9,\*]+\]*)
(?因为您已经有了一个解析器,只想知道另一种方法,所以您可以考虑
import json, re
s = "thing_1,thing_2,things_3[thing_31,thing_32,thing_34[thing_341]],thing_5"
s = re.sub(r'\w+(?![\[\w])', r'"\g<0>": true', s)
js = json.loads('{' + re.sub(r'\w+(?=\[)', r'"\g<0>":', s).replace('[', '{').replace(']', '}') + '}')
print (json.dumps(js, indent=4, sort_keys=True))
看
注意事项:
re.sub(r'\w+(?![\[\w]),r'\g:true',s)
-用双引号包装所有不紧跟在[
后面的1+字字符块,并在其后面附加:true
re.sub(r'\w+(?=\[)',r''\g):',s)
-将紧跟在[
后面的所有1+字字符块用双引号括起来,并在其后面附加:
.replace('[','{')。replace(']','}')
将所有[
替换为{
,将]
替换为}
- 要将字符串解析为JSON,结果用
{…}
- 使用
json.loads
解析后,json.dumps(js,indent=4,sort\u keys=True)
pretty打印json并转储它
为什么跳过thing\u 5
?类似于json.dumps(json.loads({'+re.sub(r'\w+(?=\[)',r'''\g):',re.sub(r'\w+(![\w]),r'\g:true',s)).replace('[','{').replace(']','}+''''+'}'),indent=4,sort\u-keys=true)
可能有用。请看。@RomanPerekhrest,谢谢,我已经更新了输出采样器。XPS本身无法解析任意嵌套的结构,为此您需要一个合适的解析器。@WiktorStribiżew,这有诗意的性质!!这是一个漂亮的解决方案,我甚至没有考虑过这个方向。您能把它作为一个答案重新发布吗?Th谢谢!这对我来说是件好事。是的,这是一个文本替换解决方案,但如果代码可以是诗歌或歌曲,这是一个带有脏吉他的数字,会留下痕迹。
{
"thing_1": true,
"thing_2": true,
"thing_5": true,
"things_3": {
"thing_31": true,
"thing_32": true,
"thing_34": {
"thing_341": true
}
}
}