Как разобрать эту строку с PyParsing? - PullRequest
1 голос
/ 09 ноября 2019

Я хочу разобрать:

'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 голосов
/ 10 ноября 2019

Вы определенно на правильном пути. Вам просто нужно сделать отрицательный прогноз 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']]
...