我有一个如下所示的配置文本:
text="""
key1 value1
key2 { value1 value2 }
key3 subkey1 {
key1 1
key2 2
key3 {
value1
}
}
BLOBKEY name {
dont {
# comment
parse { me }
}
}
key3 subkey2 {
key1 value1
}
"""
这些值是纯字符串或带引号的字符串。键只是字母数字字符串。我事先知道这一点key2
并且key3.subkey1.key4
会持有套路,所以我可以以不同的方式对待这些路径。同样,我知道BLOBKEY
它将包含一个“转义”配置部分。
目标是将其转换为如下所示的字典:
{'key1': 'value1',
'key2': set(['value1', 'value2']),
'key3': {
'subkey1': {
'key1': 1,
'key2': 2,
'key3': set(['value1']),
},
'subkey2': {
'key1': 'value1'
}
},
'BLOBKEY': {
'name': " dont {\n # comment\n parse { me }\n }\n"
}
}
下面的代码在将其分解为一堆嵌套列表方面做得很好。
import pyparsing
string = pyparsing.CharsNotIn("{} \t\r\n")
group = pyparsing.Forward()
group << (
pyparsing.Group(pyparsing.Literal("{").suppress() +
pyparsing.ZeroOrMore(group) +
pyparsing.Literal("}").suppress()) |
string
)
toplevel = pyparsing.OneOrMore(group)
在 Python 中使用 pyparsing 获得我想要的结果的最佳方法是什么?