我需要解析(并提供给数据库)这样的配置文件(实际上是Asterisk
' s sip.conf
):
[client-template](!,natted-template)
foo=foovalue
moo=moovalue
[client](client-template)
bar=barvalue
此语法表示client-template
是基于!
(在其他地方定义)的模板本身(因为括号中的natted-template
)。 client
是基于client-template
的对象定义。
我可以使用ConfigParser
,但看起来我需要更强大或定制的东西?
答案 0 :(得分:0)
好吧,现在我已经尝试了pyparsing
:
import pyparsing as pp
filename = 'client.conf'
nametag = pp.Word(pp.alphanums + "-_")
variable = pp.Word(pp.alphanums)
value = pp.Word(pp.alphanums + "=")
vardef = pp.Group(variable('variable') + pp.Literal("=").suppress() + value('value'))
vardefs = pp.Group(pp.ZeroOrMore(vardef))('vardefs')
section = pp.Group(pp.Literal("[").suppress() \
+ nametag('objectname') \
+ pp.Literal("]").suppress() \
+ pp.Optional(
pp.Literal("(").suppress() \
+ pp.Optional("!")('istemplate')
+ pp.ZeroOrMore(pp.Optional(",").suppress() + nametag)('parenttemplates') \
+ pp.Literal(")").suppress()
) \
+ vardefs)
section = section + pp.Optional(pp.SkipTo(section)).suppress()
section_group = pp.Group(section + pp.ZeroOrMore(section))('sections')
config = (pp.SkipTo(section_group).suppress() \
+ section_group)
# res = config.parseString(open(filename).read())
这是一个解决方案的一部分(到目前为止这是注释不知道的),但我可以继续。
如果有更优雅的解决方案,请告诉我。