我需要解析配置文件,其中配置命令可能会被省略(所以我想使用Optional
和{Each
)。总之,让我们从有序配置开始:
teststr = """
interface 4
frames tagged
exit
interface 5
pvid 17
exit
"""
portid = Word(nums)('portid')
pvid = Keyword('pvid').suppress() + Word(nums)('pvid')
frames = Keyword('frames').suppress() \
+ (Keyword('tagged') | Keyword('all'))
exit = Keyword('exit')
interface = Group(
Keyword('interface') + portid \
+ Optional(pvid) \
+ Optional(frames, default='all')('frames') \
+ exit
)
interface_list = Group(interface + ZeroOrMore(interface))('interfaces')
res = interface_list.parseString(teststr)
for iface in res.interfaces:
print '{}\n'.format(iface.dump())
这段代码给出了这个结果(我相信这是可以的——请注意,第一部分的frames
设置为tagged
):
但是现在我想解析这个配置,假设命令pvid
和{Each
:
interface = pp.Group(
pp.Keyword('interface') + portid + (
pp.Optional(pvid)
& pp.Optional(frames, default='all')('frames')
) + exit)
现在我错了(我相信)结果是:
['interface', '4', 'tagged', 'all', 'exit']
- frames: ['all']
- portid: 4
['interface', '5', '17', 'all', 'all', 'exit']
- frames: ['all', 'all']
- portid: 5
- pvid: 17
我希望pyparsing
返回与使用And
运算符时相同的结果。我错了吗?有什么问题吗?
所以,我已经有了2.0.3版本,并应用了这个补丁:
然后我更改了
^{pr2}$interface
的定义:这给了我最“直观”的结果,我会说:
该补丁不会破坏当前svn中的任何[更多]测试。不管怎样,我不知道我在做什么,所以我仍然在寻找答案。在
@paul mcguire,对不起,升级到2.0.3对我没有帮助。在
谢谢你。)
你在使用什么版本的pyparsing?使用pyparsing 2.0.3,使用示例程序,我得到:
相关问题 更多 >
编程相关推荐