<p>这个pyparsing代码将把您的配置条目解析成一个映射,您可以像dict或object那样使用它:</p>
<pre><code>from pyparsing import *
LBRACE,RBRACE,LBRACK,RBRACK,COLON,EQ = map(Suppress, "{}[]:=")
NL = LineEnd()
key = Word(alphas, alphanums+'_')
# forward declare value, since this will be a recursive definition
value = Forward()
key_value = Group(key + COLON + value)
# parse actions will do string->int and string->float conversions at parse time
integer = Regex(r'[+-]?\d+').setParseAction(lambda t: int(t[0]))
real = Regex(r'[+-]?\d+\.\d*').setParseAction(lambda t: float(t[0]))
string = restOfLine.setParseAction(lambda t: t[0].strip())
dictvalue = Group(LBRACE + Dict(ZeroOrMore(key_value)) + RBRACE)
listvalue = Group(LBRACK + Dict(ZeroOrMore(value)) + RBRACK)
# assign recursive contents to value using <<=
value <<= (real | integer) + FollowedBy(NL) | dictvalue | listvalue | string
setting = Group(key + EQ + value)
config_parser = Dict(OneOrMore(setting))
config = config_parser.parseString(data)
# dump out parsed contents
print config.dump()
# access parsed contents like a dict or an object
print config.keys()
print config.router1.keys()
print config.router1.hostname
</code></pre>
<p>印刷品:</p>
<pre><code>[['router1', [['hostname', 'abcd '], ['interfaces', [['interface', ...
- router1: [['hostname', 'abcd '], ['interfaces', [['interface', ...
- clear: clear config all
- hostname: abcd
- interfaces: [['interface', 'gigabit 0/1 '], ['valn', 100], ...
- interface: gigabit 0/1
- ip_address: 1.1.1.1
- name: vlan1
- valn: 100
['router1']
['interfaces', 'hostname', 'clear']
abcd
</code></pre>
<p>请注意,作为解析过程的一部分,那些有效float或int值已经从字符串转换而来。你知道吗</p>