基于这个语法:
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']
答案 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']