在listAllMatches为true的情况下使用setResultsName时,会嵌套一些匹配的项

2024-04-29 05:53:25 发布

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

基于此语法:

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('-')”。在

^{pr2}$

如何让他们表现得一样?我想达到以下结果:

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

Tags: alioutegchoicecowholysuppressquotedstring
1条回答
网友
1楼 · 发布于 2024-04-29 05:53:25

我研究这个问题已经有一段时间了-问题是和总是以列表的形式返回它们的令牌,即使它们只包含一个值。在

下面是一个解组器,它可以帮您清除这个问题,我将在下一个pyparsing版本中包含它:

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

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

^{pr2}$

相关问题 更多 >