在Python中进行文本处理时遇到问题

时间:2014-08-12 19:29:08

标签: python python-2.7 text-processing

我遇到了一种奇怪的语法,我试图强迫进行一些更加蟒蛇友好的事情。

给出这样的结构:

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)

1 个答案:

答案 0 :(得分:1)

这就是你真正想要一个完整的解析器生成器来为你完成工作的事情。那里有一个庞大的Python解析器(也就是说,用于Python,而不是解析Python代码),但是,标准库中没有任何东西。我对它们中的任何一个都没有多少经验,但它绝对值得一试:如果可以避免的话,解析不是特别要做的事情。 (见https://wiki.python.org/moin/LanguageParsing。)

如果不这样做,你应该考虑编写一个递归下降的解析器。你的语法,除非我错过了我的猜测,可以很容易地制定而不需要左递归,使得递归下降解析器可以直接写入。解析器中的每个术语函数都将返回一个数据对象,供调用它的术语函数使用。不太困难,它的优点是不需要单独的标记化传递。