我有一个类似字典的字符串,如下所示:
str = "Access AR1:\n\tTargets: \n\t\tManagement Name:csw_1\n\t\tObject Name:csw_obj_1\n\t\tdetails:103\n\t\tManagement Name:csw_123\n\t\tObject Name:csw_obj_134\n\t\tdetails:123\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\t\tManagement Name:csw_431\n\t\tObject Name:csw_obj_21\n\t\tdetails:134\n\tSources: \n\t\tIP:10.20.10.10\n\t\tSubnet Mask:255.255.255.192"
这是以相同的格式进行的,它看起来像:
Access AR1:
Targets:
Management Name:csw_1
Object Name:csw_obj_1
details:103
Management Name:csw_123
Object Name:csw_obj_134
details:123
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
Management Name:csw_431
Object Name:csw_obj_21
details:134
Sources:
IP:10.20.10.10
Subnet Mask:255.255.255.192
这需要更改为:
str = {"Access AR1": { "Targets": [{"Management Name:csw_1", "Object Name":"csw_obj_1", "details":"103"}, {"Management Name:csw_123", "Object Name":"csw_obj_134", "details":"123"}]
"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"}, {"Management Name:csw_431", "Object Name":"csw_obj_21", "details":"133"}]
"Sources": {"IP":"10.20.10.10", "Subnet Mask": "255.255.255.192"}
}
}
我试过了ast.literal_eval, eval
,结果却出错了
您的字符串几乎是yaml-将\t替换为一个或多个空格,它将作为yaml加载
第一:
那么这个代码就起作用了:
输出:
或者,如果您确实希望将其作为字符串,则:
更新
刚刚意识到例如“Managent Name:csw_1”没有被检测为key:value。需要一个regex
re.sub()
将它们拆分为单独的行以修复此问题:这是调整后的字符串:
结果:
您好,这是您需要的解决方案
您可以使用递归将输入转换为字典,而无需事先对字符串本身进行任何调整:
输出:
相关问题 更多 >
编程相关推荐