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"
}
}
我有这样的字符串:
[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"
}
}