如何将类似字典的字符串转换为字典?

我有一个像字符串这样的字典,如下所示:

str = "Access AR1:ntTargets: nttManagement Name:csw_1nttObject Name:csw_obj_1nttdetails:103nttManagement Name:csw_123nttObject Name:csw_obj_134nttdetails:123ntSources: nttIP:10.20.30.40nttSubnet Mask:255.255.255.255nAccess AR2:ntTargets: nttManagement Name:csw_2nttObject Name:csw_obj_2nttdetails:110nttManagement Name:csw_431nttObject Name:csw_obj_21nttdetails:134ntSources: nttIP:10.20.10.10nttSubnet 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。

第一的:

pip install pyyaml

然后这段代码有效:

import yaml
import pprint

str = "Access AR1:ntTargets: nttManagement Name:csw_1nttObject Name:csw_obj_1nttdetails:103ntSources: nttIP:10.20.30.40nttSubnet Mask:255.255.255.255nAccess AR2:ntTargets: nttManagement Name:csw_2nttObject Name:csw_obj_2nttdetails:110ntSources: nttIP:10.20.10.10nttSubnet Mask:255.255.255.192"

str1 = str.replace( 't', '    ' )

res = yaml.load(str1)

pprint.pprint( res )

输出:

{'Access AR1': {'Sources': 'IP:10.20.30.40 Subnet Mask:255.255.255.255',
                'Targets': 'Management Name:csw_1 Object Name:csw_obj_1 '
                           'details:103'},
 'Access AR2': {'Sources': 'IP:10.20.10.10 Subnet Mask:255.255.255.192',
                'Targets': 'Management Name:csw_2 Object Name:csw_obj_2 '
                           'details:110'}}

或者,如果你真的想把它作为一个字符串,那么:

str = repr(res)

更新

刚刚意识到例如'Managent Name:csw_1' 没有被检测为键:值。需要一个正则表达式re.sub()将这些拆分为单独的行来解决这个问题:

import yaml
import pprint
import re

str = "Access AR1:ntTargets: nttManagement Name:csw_1nttObject Name:csw_obj_1nttdetails:103ntSources: nttIP:10.20.30.40nttSubnet Mask:255.255.255.255nAccess AR2:ntTargets: nttManagement Name:csw_2nttObject Name:csw_obj_2nttdetails:110ntSources: nttIP:10.20.10.10nttSubnet Mask:255.255.255.192"

# replace t with four-space indent
str1 = str.replace( 't', '    ' )

# further tweak to split sub-keys like " Management Name:csw_1" onto separate lines
str1 = re.sub(r"^(s+)(.*?S:)(S.*)", r"12n1    3",str1,flags=re.MULTILINE )
   
res = yaml.load(str1)

pprint.pprint( res )

这是调整后的字符串:

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

结果:

{'Access AR1': {'Sources': {'IP': '10.20.30.40',
                            'Subnet Mask': '255.255.255.255'},
                'Targets': {'Management Name': 'csw_1',
                            'Object Name': 'csw_obj_1',
                            'details': 103}},
 'Access AR2': {'Sources': {'IP': '10.20.10.10',
                            'Subnet Mask': '255.255.255.192'},
                'Targets': {'Management Name': 'csw_2',
                            'Object Name': 'csw_obj_2',
                            'details': 110}}}


以上是如何将类似字典的字符串转换为字典?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>