"扩展" Python中基于模板的INI文件解析

时间:2017-11-08 11:08:24

标签: python parsing asterisk ini configparser

我需要解析(并提供给数据库)这样的配置文件(实际上是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,但看起来我需要更强大或定制的东西?

1 个答案:

答案 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())

这是一个解决方案的一部分(到目前为止这是注释不知道的),但我可以继续。

如果有更优雅的解决方案,请告诉我。