有没有办法以递归方式解析字符串以获取dict
?
字符串:
string = 'a {\
b: text;\
c {\
d: text;\
}\
}';
出:
{
'a' : {
'b': 'text',
'c': {
'd' : 'text';
}
}
}
UPD: 我是Python的新手,我没有一个库等形式的现成解决方案,我想了解这个问题的算法的逻辑(任何代码,如果可能或理论)
答案 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'}}
要理解代码背后的理论,你可以阅读一本书,讨论词汇分析(正则表达式和有限自动机),语法分析(EBNF,无上下文语法,LL解析器)。< / p>