Нежадный анализ списка с помощью pyparsingPython

Программы на Python
Ответить
Anonymous
 Нежадный анализ списка с помощью pyparsing

Сообщение Anonymous »

У меня есть строка, состоящая из списка слов, которые я пытаюсь проанализировать с помощью pyparsing.
Список всегда содержит минимум три элемента. Исходя из этого, я хочу, чтобы pyparsing сгенерировал три группы, первая из которых содержит все слова до двух последних элементов, а последние две группы должны быть двумя последними элементами. Например:

Код: Выделить всё

"one two three four"
должен быть преобразован во что-то похожее:

Код: Выделить всё

["one two"], "three", "four"
Я могу сделать это с помощью регулярного выражения:

Код: Выделить всё

import pyparsing as pp

data = "one two three four"
grammar = pp.Regex(r"(?P(\w+\W?)+)\s(?P
\w+) (?P\w+)")
print(grammar.parseString(data).dump())
что дает:

Код: Выделить всё

['one two three four']
- first: one two
- penultimate: three
- ultimate: four
Моя проблема в том, что я не могу получить тот же результат с ParserElement, не являющимся регулярным выражением, из-за жадного характера pyparsing, например следующего:

Код: Выделить всё

import pyparsing as pp

data = "one two three four"
word = pp.Word(pp.alphas)
grammar = pp.Group(pp.OneOrMore(word))("first") + word("penultimate") + word("ultimate")
grammar.parseString(data)
не удается выполнить обратную трассировку:

Код: Выделить всё

Traceback (most recent call last):
File "", line 1, in 
File "/usr/lib/python2.7/site-packages/pyparsing.py", line 1125, in parseString
raise exc
pyparsing.ParseException: Expected W:(abcd...) (at char 18), (line:1, col:19)
потому что OneOrMore поглощает все слова в списке. Мои попытки предотвратить это жадное поведение с помощью FollowedBy или NotAny не увенчались успехом. Как мне добиться желаемого поведения?


Подробнее здесь: https://stackoverflow.com/questions/309 ... -pyparsing
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»