最好的方法是使用现有格式,如JSON.
这是您的格式的示例解析器:
from lepl import (AnyBut, Digit, Drop, Eos, Integer, Letter, NON_GREEDY, Regexp, Space, Separator, Word) # EBNF # name = ( letter | "_" ) , { letter | "_" | digit } ; name = Word(Letter() | '_', Letter() | '_' | Digit()) # words = word , space+ , word , { space+ , word } ; # two or more space-separated words (non-greedy to allow comment at the end) words = Word()[2::NON_GREEDY, ~Space()[1:]] > list # value = integer | word | words ; value = (Integer() >> int) | Word() | words # comment = "#" , { all characters - "\n" } , ( "\n" | EOF ) ; comment = '#' & AnyBut('\n')[:] & ('\n' | Eos()) with Separator(~Regexp(r'\s*')): # statement = name , "=" , value ; statement = name & Drop('=') & value > tuple # suite = "{" , { comment | statement } , "}" ; suite = Drop('{') & (~comment | statement)[:] & Drop('}') > dict # block = name , suite ; block = name & suite > tuple # config = { comment | block } ; config = (~comment | block)[:] & Eos() > dict from pprint import pprint pprint(config.parse(open('input.cfg').read()))
输出:
[{'block1': {'othervalue': 32423432, 'some_value': ['some', 'other', 'kind', 'of', 'data'], 'value': 'data'}, 'block2': {'othervalue': 32423432, 'some_value': ['some', 'other', 'kind', 'of', 'data'], 'value': 'data'}}]