Python:如何将字符串解析为递归字典

标签 python python-2.7

来自一个文件,我有类似以下字符串的内容:

var1 : data1
var2 : data2
dict1 {  
     var3 : data3  
     dict2 {  
         var4 : data4  
     }
     var5 : data5
}
dict3 {
     var6 : data6
     var7 : data7
}

等等。 (行尾为\n,缩进为\t)
我尝试将其转换为类似的东西:

Dictionary={"var1":"data1","var2":"data2", "dict1" : 
    {"var3":"data3", "dict2" : {
        "var4":"data4" }, "var5":"data5"}
    , dict3:{"var6":"data6","var7":"data7"}

(缩进只是为了保持其可读性)
为了解决这个问题,我能想到的就是将它分成一个列表,然后沿着列表向下走,直到在字符串中找到一个“}”,删除它(这样我以后就不会遇到它了),然后走直到找到带有“{”的字符串,删除前面的空格和后面的“{”(现在使用 temp=re.split ('(\S+)\{',out[z]) 对于此示例,第一个 temp[1] 将是“dict2”),添加其间的所有内容,最后转到下一个“}”。

但这既不快速也不优雅。我肯定错过了一些东西。
当前代码是:

def procvar(strinG):
    x=y=z=temp1=temp2=0
    back = False
    out=re.split ('\n',strinG) #left over from some other tries
    while z < len(out):
        print "z=",z," out[z]= ", out[z]
        if "{" in out[z]:
            if back == True:
                back = False
                xtemp=re.split ('(\S+) \{',out[z])
                out[z]=xtemp[1]
                ytemp=xtemp[1]
                temp2=z+1
                print "Temp: ",temp1," - ",out[temp1]
                out[z]={out[z]:[]}
                while temp2 <= temp1:
                    out[z][xtemp[1]].append(out[temp2]) # not finished here, for the time being I insert the strings as they are
                    del out[temp2]
                    temp1-=1
                print out[z]
        if "}" in out[z]:
            back = True
            del out[z]
            temp1 = z-1
        if back == True:
            z-=1
        else:
            z+=1
    return out

最佳答案

您的格式足够接近 yaml 格式(easy_install pyyaml): http://pyyaml.org/wiki/PyYAML

x = """var1 : data1
var2 : data2
dict1 {  
     var3 : data3  
     dict2 {  
         var4 : data4  
     }
     var5 : data5
}
dict3 {
     var6 : data6
     var7 : data7
}"""

x2 = x.replace('{', ':').replace('}','')
yaml.load(x2) 

{'dict1': {'dict2': {'var4': 'data4'}, 'var3': 'data3', 'var5': 'data5'},
 'dict3': {'var6': 'data6', 'var7': 'data7'},
 'var1': 'data1',
 'var2': 'data2'}

关于Python:如何将字符串解析为递归字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18166649/

相关文章:

python - 如何使用另一个列表中的匹配值索引来复制列表值?

python - 为什么我在 Python3 中加载模块有问题,但在 Python2 中却没有?

python-2.7 - Pyqt4-pyqtgraph 应用程序递归地打开自己的新实例

python - 我如何在 Python 或 Ruby 上查询没有 Selenium 的结果

python - 不使用 for 循环迭代数组元素

python - 在elasticsearch中存储 token 频率,而不是存储文本

python - scipy curve_fit 对于大 X 值不正确

python - Python 中的伪指针功能

Python 和正则表达式

python - 通过 CGI (Python) 运行 sudo 命令