我遇到了一种奇怪的语法,我试图强迫进行一些更加蟒蛇友好的事情。
给出这样的结构:
s = "a1{b2{a3|b3}c2{d3|e3}e2{a4}}b1{a6|b7}"
处理完文本后,您最终应该:
data == {
'a1': {
'b2': ['a3', 'b3'],
'c2': ['d3', 'e3'],
'e2': 'a4'},
'b1': ['a6', 'b7']
}
我正在努力解决这个问题,并希望得到一些有关如何正确解析这一问题的帮助。显然,这个例子只是一个例子,但是" |"," {","}"的标记。是正确的分裂者。
def parse_tree_to_dict(data):
level, word, key, tree = 0, "", "", []
index_tree = []
result = {}
for letter in data:
if letter == "|":
print("{0} {1} {2}".format(" "*level, "|", word))
tree.append(word)
word = ""
elif letter == "{":
print("{0} {1} {2}".format(" "*level, "{", word))
key = word
index_tree.append(key)
word = ""
level += 1
elif letter == "}":
print("{0} {1} {2}".format(" "*level, "}", word))
key = key if key else word
result[key] = tree if len(tree) else word
try:
result = result[index_tree.index(key)-1]
except (KeyError, IndexError):
pass
level -= 1
else:
word += letter
return result
if __name__ == "__main__":
s = "a1{b2{a3|b3}c2{d3|e3}e2{a4}}b1{a6|b7}"
data = parse_tree_to_dict(s)
assert data == {
'a1': {
'b2': ['a3', 'b3'],
'c2': ['d3', 'e3'],
'e2': 'a4'},
'b1': ['a6', 'b7']
}, "Nice try.. {} is wrong".format(data)
答案 0 :(得分:1)
这就是你真正想要一个完整的解析器生成器来为你完成工作的事情。那里有一个庞大的Python解析器(也就是说,用于Python,而不是解析Python代码),但是,标准库中没有任何东西。我对它们中的任何一个都没有多少经验,但它绝对值得一试:如果可以避免的话,解析不是特别要做的事情。 (见https://wiki.python.org/moin/LanguageParsing。)
如果不这样做,你应该考虑编写一个递归下降的解析器。你的语法,除非我错过了我的猜测,可以很容易地制定而不需要左递归,使得递归下降解析器可以直接写入。解析器中的每个术语函数都将返回一个数据对象,供调用它的术语函数使用。不太困难,它的优点是不需要单独的标记化传递。