pyparsing:每个都使用可选的默认issu

2024-09-27 04:21:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要解析配置文件,其中配置命令可能会被省略(所以我想使用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):

^{pr2}$

但是现在我想解析这个配置,假设命令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运算符时相同的结果。我错了吗?有什么问题吗?


Tags: 命令framesexitgroupallkeywordoptionalinterface
2条回答

所以,我已经有了2.0.3版本,并应用了这个补丁:

 - pyparsing-2.0.3.py  2015-07-16 17:30:16.705011488 +0300
+++ pyparsing-2.0.3-patched.py  2015-07-16 17:35:03.977015739 +0300
@@ -2811,6 +2811,9 @@
         self.defaultValue = default
         self.mayReturnEmpty = True

+        if self.defaultValue is not _optionalNotMatched:
+            self.mayReturnEmpty = False
+
     def parseImpl( self, instring, loc, doActions=True ):
         try:
             loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False )

然后我更改了interface的定义:

^{pr2}$

这给了我最“直观”的结果,我会说:

['interface', '4', 'tagged', 'exit']
- frames: ['tagged']
- portid: 4

['interface', '5', '17', 'all', 'exit']
- frames: all
- portid: 5
- pvid: 17

该补丁不会破坏当前svn中的任何[更多]测试。不管怎样,我不知道我在做什么,所以我仍然在寻找答案。在

@paul mcguire,对不起,升级到2.0.3对我没有帮助。在

谢谢你。)

你在使用什么版本的pyparsing?使用pyparsing 2.0.3,使用示例程序,我得到:

['interface', '4', 'tagged', 'exit']
- frames: ['tagged']
- portid: 4

['interface', '5', '17', 'all', 'exit']
- frames: ['all']
- portid: 5
- pvid: 17

相关问题 更多 >

    热门问题