Python Reg ex解析带有括号嵌套子列表的列表?

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 }

我正在尝试重构一些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
      }
   },
   "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
        }
    }
}