0

基于此语法:

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是它有一个领先的`Suppress('-')'。

['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']
4

1 回答 1

1

我已经有一段时间没有看到这个问题了——问题是 And 总是将它们的标记作为列表返回,即使它们只包含一个值。

这是一个可以为您清除此问题的 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']
于 2011-05-11T15:06:30.500 回答