将setResultsName与listAllMatches一起使用时,会嵌套一些匹配的项目

时间:2011-05-11 10:05:24

标签: python pyparsing

基于这个语法:

from pyparsing import *

g = quotedString.setParseAction( removeQuotes )
eg = Suppress('-') + quotedString.setParseAction( removeQuotes )
choice = Or( [ g.setResultsName("out",listAllMatches=True),     
              eg.setResultsName("in",listAllMatches=True) ] )
grammar = ZeroOrMore( choice ) + Suppress(restOfLine)

a = world.parseString( ' "ali"  -"baba"  "holy cow"   -"smoking beaute"  ' )
print a.dump()

我发现满足eg非终结符的标记总是包含在一个额外的列表中。与g的唯一区别在于它具有领先的“抑制(' - ')'。

['ali', 'baba', 'holy cow', 'smoking beaute']
- in: [['baba'], ['smoking beaute']]
- out: ['ali', 'holy cow']

如何使它们表现相同?我想实现以下结果:

['ali', 'baba', 'holy cow', 'smoking beaute']
- in: ['baba', 'smoking beaute']
- out: ['ali', 'holy cow']

1 个答案:

答案 0 :(得分:1)

自从我看过这个问题已经有一段时间了 - 问题是并且总是将它们的标记作为列表返回,即使它只包含一个值。

这是一个可以为你清除的ungrouper,我将在下一个pyparsing版本中包含这个:

ungroup = lambda expr : TokenConverter(expr).setParseAction(lambda t:t[0])
eg = ungroup(Suppress('-') + quotedString.setParseAction( removeQuotes ))

使用您的测试代码,我现在得到以下结果:

['ali', 'baba', 'holy cow', 'smoking beaute']
- in: ['baba', 'smoking beaute']
- out: ['ali', 'holy cow']