递归解析字符串

时间:2012-02-06 18:42:53

标签: python parsing recursion dictionary

有没有办法以递归方式解析字符串以获取dict

字符串:

string = 'a {\
    b: text;\
    c {\
        d: text;\
    }\
}';

出:

{
    'a' : {
        'b': 'text',
        'c': {
            'd' : 'text';
        }
    }
}

UPD: 我是Python的新手,我没有一个库等形式的现成解决方案,我想了解这个问题的算法的逻辑(任何代码,如果可能或理论)

3 个答案:

答案 0 :(得分:3)

您应该查看pyparsing模块。

  

与传统的lex / yacc方法或正则表达式的使用相比,pyparsing模块是创建和执行简单语法的另一种方法。 pyparsing模块提供了一个类库,客户端代码使用这些类直接在Python代码中构造语法。

对于这样的情况,您可以编写描述您尝试解析的字符串的语法,并避免编写解析器。

更新(每条评论):如果有兴趣了解解析这些字符串后的理论基础,那么您需要了解您的目标是什么。这个问题以更一般的形式解析了一个无上下文的语言。您有一组规则,称为语法,它规定了输入中数据结构的层次结构。从教育的角度来看,开始阅读的好地方是Backus–Naur Form

答案 1 :(得分:2)

为此编写recursive descent parser应该不会太困难。那里有tutorials描述了如何做到这一点。

答案 2 :(得分:1)

使用lepl解析器库:

#!/usr/bin/env python
from lepl import AnyBut, Delayed, Drop, DroppedSpace

def Parser():
    dict_ = Delayed()
    str_ = AnyBut('{}:;')[1::'n',...]

    with DroppedSpace():
        pair = str_ & Drop(':') & str_ & Drop(';') > tuple
        value = str_ & dict_ > tuple
        dict_ += Drop('{') & (pair | value)[:] & Drop('}') > dict
        return value > dict

print(Parser().parse("a {  b: text;  c { d: text; }}")[0])

输出

{'a': {'c': {'d': 'text'}, 'b': 'text'}}

另见Python parsing tools

要理解代码背后的理论,你可以阅读一本书,讨论词汇分析(正则表达式和有限自动机),语法分析(EBNF,无上下文语法,LL解析器)。< / p>