2017-11-08 5 views
0

ich analysieren müssen (und Futtermittel in einer Datenbank) Konfigurationsdateien wie diese (eigentlich ist es Asterisk ‚s sip.conf):"Erweitert" Template-basierte INI-Datei-Analyse in Python

[client-template](!,natted-template) 
foo=foovalue 
moo=moovalue 

[client](client-template) 
bar=barvalue 

Diese Syntax Mittel dass client-template ist eine Vorlage selbst (wegen ! in Klammern) basierend auf natted-template (definiert an anderer Stelle). Und client ist eine Objektdefinition, basierend auf client-template.

Ich könnte ConfigParser verwenden, aber es sieht so aus, als ob ich etwas stärkeres oder kundenspezifisches brauche?

Antwort

0

Nun, jetzt habe ich versucht, 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()) 

Dies ist ein Teil einer Lösung (und das ist nicht bewusst Kommentare bisher), aber ich kann damit fortfahren.

Bitte, wenn es elegantere Lösung gibt, lass es mich wissen.