В ответ на редактирование ОП ответ ниже не является полным.
Я собираюсь попытаться понять суть вашего вопроса здесь и проигнорировать более тонкие детали.Надеюсь, это поможет вам правильно выбрать грамматику.По сути, вы спрашиваете, учитывая две строки:
P 3 811 190 815 180 806 185
P 2 811 190 815 180 806 185
как вы можете анализировать данные так, что во второй строке читаются только две точки?Лично я бы прочитал все данных и после разбора.Вы можете значительно облегчить себе работу, если вы назовете результаты .Например:
from pyparsing import *
EOL = LineEnd().suppress()
number = Word(nums).setParseAction(lambda x: int(x[0]))
point_pair = Group(number + number)
poly_flag = Group(Literal("P") + number("length"))("flag")
poly_type = poly_flag + Group(OneOrMore(point_pair))("data")
xdot_line = Group(poly_type) + EOL
grammar = OneOrMore(xdot_line)
Обратите внимание, что у нас есть имена data, flag
и length
, это пригодится позже.Давайте разберем и обработаем строку:
S = "P 3 811 190 815 180 806 185\nP 2 811 190 815 180 806 185\n"
P = grammar.parseString(S)
for line in P:
L = line["flag"]["length"]
while len(line["data"]) > L:
line["data"].pop()
Даем полезный и структурированный результат:
[['P', 3], [[811, 190], [815, 180], [806, 185]]]
[['P', 2], [[811, 190], [815, 180]]]
Расширяем грамматику
Отсюда вы можете самостоятельно строить кускиграмматики один за другим.Каждый раз, когда вы добавляете новый тип, добавляйте его к xdot_line
, то есть
xdot_line = Group(poly_type | pen_fill_type) + EOL