Pyparsing路由器配置:带缩进的不完整语法

时间:2014-04-29 07:27:30

标签: python pyparsing

总结:我想解析具有缩进块的配置文件。这些缩进块可以包含大量可能的命令。我想解析我为其定义语法的命令子集,但是捕获不匹配的行,并将它们存储为文本字符串。

路由器配置如下所示:

router bgp 1
    bgp router-id 192.168.0.1
    network 10.0.0.0/16
    neighbor 192.168.0.2 remote-as 1
    neighbor 192.168.0.2 update-source 192.168.0.1
    neighbor 192.168.0.2 next-hop-self
    neighbor 192.168.0.3 remote-as 1
    neighbor 192.168.0.3 update-source 192.168.0.1
    neighbor 192.168.0.3 next-hop-self
    neighbor 192.168.0.4 remote-as 1
    neighbor 192.168.0.4 update-source 192.168.0.1
!
router ospf
    network 1.2.3.4/30 area 0

这采用节开放线+缩进块+可选节结束线的形式。

我的问题是路由器配置可能会占用大量参数。有些我想解析,但对于其他未被识别的人,我想在返回的结果中存储为“misc”字符串,而不是完全跳过它们。

所以我的语法是首先尝试匹配已知的语句,例如

router_id = Group("bgp router-id" +  t_ipv4_address)  + EOL

具有以下内容:

bgp_line = (networkline ^ neighborline ^ router_id )
bgp_data = indentedBlock(OneOrMore(bgp_line), indentStack, True)

我将整个块定义为:

bgp_stanza = Group("router bgp" + Word(alphanums) + bgp_data )("bgp")

我磕磕绊绊的是存储与networkline ^ neighborline ^ router_id之一不匹配的行。

如果我定义

misc_line =  LineStart() + Group(OneOrMore(Word(alphanums + "-" + "." + "/" + ":" )) + LineEnd()

并将其添加到我的原始语法中:

bgp_line = (networkline ^ neighborline ^ router_id ^ misc_line )

然后转储结果会捕获多行:

- bgp: ['router bgp', '1', [[['bgp', 'router-id', '192.168.0.1', 'network', '10.0.0.0/16', 'neighbor', '192.168.0.2', 'remote-as', '1', 'neighbor', '192.168.0.2', 'update-source', '192.168.0.1', 'neighbor', '192.168.0.2', 'next-hop-self', 'neighbor', '192.168.0.3', 'remote-as', '1', 'neighbor', '192.168.0.3', 'update-source', '192.168.0.1', 'neighbor', '192.168.0.3', 'next-hop-self', 'neighbor', '192.168.0.4', 'remote-as', '1', 'neighbor', '192.168.0.4', 'update-source', '192.168.0.1']]]]

是否可以捕获与networkline,neighborline或router_id之一不匹配的行,而不捕获其中一行,或者我是否遇到了PyParsing使用的解析方法的固有限制?

我尝试过SkipTo和Scanstring的各种组合,但还没有找到神奇的组合。

感谢。

0 个答案:

没有答案