如何使用PyParsing解析此字符串?

时间:2019-11-09 16:59:53

标签: python pyparsing

我想解析:

'APPLE BANANA FOO TEST BAR'

进入:

[['APPLE BANANA'], 'FOO', ['TEST BAR']]

这是我最近的尝试:

to_parse = 'APPLE BANANA FOO TEST BAR'
words = Word(alphas)
foo = Keyword("FOO")
parser = Group(ZeroOrMore(words + ~foo)) + foo + Group(ZeroOrMore(words))
result = parser.parseString(to_parse)

但是它将返回以下错误:

>       raise ParseException(instring, loc, self.errmsg, self)
E       pyparsing.ParseException: Expected "FOO" (at char 6), (line:1, col:7)

我认为问题来自ZeroOrMore(words + ~foo)),这是“太贪心了”。根据关于SO的几个问题,解决方案是对~foo使用否定,但在这种情况下不起作用。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

您肯定在正确的轨道上。您只需要在解析foo之前进行words 的否定前瞻:

parser = Group(ZeroOrMore(~foo + words)) + foo + Group(ZeroOrMore(words))

在最近的pyparsing发行版中,我向stopOnZeroOrMore添加了一个OneOrMore参数,它们执行相同的操作,从而减少了出错的可能性:

parser = Group(ZeroOrMore(words, stopOn=foo)) + foo + Group(ZeroOrMore(words))

通过此更改,我得到:

>>> result.asList()
[['APPLE', 'BANANA'], 'FOO', ['TEST', 'BAR']]