<p>您可以使用递归将输入转换为字典,而无需事先对字符串本身进行任何调整:</p>
<pre><code>import re
s = "Access AR1:\n\tTargets: \n\t\tManagement Name:csw_1\n\t\tObject Name:csw_obj_1\n\t\tdetails:103\n\tSources: \n\t\tIP:10.20.30.40\n\t\tSubnet Mask:255.255.255.255\nAccess AR2:\n\tTargets: \n\t\tManagement Name:csw_2\n\t\tObject Name:csw_obj_2\n\t\tdetails:110\n\tSources: \n\t\tIP:10.20.10.10\n\t\tSubnet Mask:255.255.255.192"
def to_dict(d):
k, v, r = None, [], {}
for *b, a in d:
if not b:
if k is not None:
if not v:
r[j[0]] = (j:=re.split(':\s*', k))[-1]
else:
r[re.split(':\s*', k)[0]] = to_dict(v)
k, v = a, []
else:
v.append([*b[1:], a])
if k is not None:
if not v:
r[j[0]] = (j:=re.split(':\s*', k))[-1]
else:
r[re.split(':\s*', k)[0]] = to_dict(v)
return r
</code></pre>
<hr/>
<pre><code>import json
new_s = [re.findall('\t|[^\t]+$', i) for i in s.split('\n')]
print(json.dumps(to_dict(new_s), indent=4))
</code></pre>
<p>输出:</p>
<pre><code>{
"Access AR1": {
"Targets": {
"Management Name": "csw_1",
"Object Name": "csw_obj_1",
"details": "103"
},
"Sources": {
"IP": "10.20.30.40",
"Subnet Mask": "255.255.255.255"
}
},
"Access AR2": {
"Targets": {
"Management Name": "csw_2",
"Object Name": "csw_obj_2",
"details": "110"
},
"Sources": {
"IP": "10.20.10.10",
"Subnet Mask": "255.255.255.192"
}
}
}
</code></pre>