我想解析:
'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
使用否定,但在这种情况下不起作用。任何帮助将不胜感激
答案 0 :(得分:0)
您肯定在正确的轨道上。您只需要在解析foo
之前进行words
的否定前瞻:
parser = Group(ZeroOrMore(~foo + words)) + foo + Group(ZeroOrMore(words))
在最近的pyparsing发行版中,我向stopOn
和ZeroOrMore
添加了一个OneOrMore
参数,它们执行相同的操作,从而减少了出错的可能性:
parser = Group(ZeroOrMore(words, stopOn=foo)) + foo + Group(ZeroOrMore(words))
通过此更改,我得到:
>>> result.asList()
[['APPLE', 'BANANA'], 'FOO', ['TEST', 'BAR']]