总结:我想解析具有缩进块的配置文件。这些缩进块可以包含大量可能的命令。我想解析我为其定义语法的命令子集,但是捕获不匹配的行,并将它们存储为文本字符串。
路由器配置如下所示:
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的各种组合,但还没有找到神奇的组合。
感谢。