Python 正在从字符串中解析键=值

Python Parsing key=value from string

我有这样的字符串:

[KEY1=ABC, KEY2=ABC, ... , KEY3={KEY123=ABC, KEY456=ABC}, KEY111=ABC, KEY4=KEY=VALUE&KEY=VALUE&KEY=VALUE]

我想把它解析成这样的python dict

dict = {
   'KEY1': 'ABC',
   'KEY2': 'ABC',
   'KEY3': '{KEY123=ABC, KEY456=ABC}',
   'KEY111': 'ABC',
   'KEY4': 'KEY=VALUE&KEY=VALUE&KEY=VALUE',
}

请注意,值可以包含 complex/special 个字符,例如 /\-@'"

万一'KEY4';它可以类似于 URL GET String 格式。范例

KE4=id=1&username=xx&url=http://xxx...&ref=1

以下代码部分有效。它不解析包含嵌套 key=val 的值。像上面的 'KEY3'

dict = builtins.dict(re.findall(r'(\S+)=(".*?"|\S+)', input))

我将你的(稍作编辑的)正则表达式放在一个函数中,你可以调用字典值来转换字典中的嵌套字符串:

import re
import json

input_str = "[KEY1=ABC, KEY2=ABC, KEY3={KEY123=ABC, KEY456=ABC}, KEY111=ABC]"

def dict_from_str(s):
    return dict(re.findall(r'(\w+)=([^{]*?|\{.*?})(?:,|$)', s.strip('[]{}')))

dict_out = dict_from_str(input_str)

for k, v in dict_out.items():
    if '=' in v:
        dict_out[k] = dict_from_str(v)

print(json.dumps(dict_out, indent=4))

输出:

{
    "KEY1": "ABC",
    "KEY2": "ABC",
    "KEY3": {
        "KEY123": "ABC",
        "KEY456": "ABC"
    },
    "KEY111": "ABC"
}

如果关卡比较多,可以考虑写一个递归函数

编辑:您可以单独处理 URL(请注意,与您的第一个示例不同,键必须是唯一的):

input_str = "[KEY1=ABC, KEY2=ABC, KEY3={KEY123=ABC, KEY456=ABC}, KEY111=ABC, KEY4=KEY=VALUE&KEY2=VALUE&KEY3=VALUE]"

def dict_from_str(s):
    return dict(re.findall(r'(\w+)=([^{]*?|\{.*?})(?:,|$)', s.strip('[]{}')))

def dict_from_url(s):
    return dict(re.findall(r'(\w+)=([^=]*?)(?:&|$)', s.strip('[]{}')))

dict_out = dict_from_str(input_str)

for k, v in dict_out.items():
    if '&' in v:
        dict_out[k] = dict_from_url(v)
    elif '=' in v:
        dict_out[k] = dict_from_str(v)

print(json.dumps(dict_out, indent=4))

输出:

{
    "KEY1": "ABC",
    "KEY2": "ABC",
    "KEY3": {
        "KEY123": "ABC",
        "KEY456": "ABC"
    },
    "KEY111": "ABC",
    "KEY4": {
        "KEY": "VALUE",
        "KEY2": "VALUE",
        "KEY3": "VALUE"
    }
}