pyparsing захватывает группы произвольного текста с заданными заголовками как вложенные списки

У меня есть текстовый файл, похожий на;

заголовок раздела 1:
некоторые слова могут быть любыми
больше слов могло быть что угодно
и т. д. и т. д. lala

другой заголовок:
по-прежнему может быть что угодно
Эй, разве это развлечение

Я пытаюсь построить грамматику с помощью pyparser, которая при запросе анализируемых результатов в виде списка привела бы к следующей структуре списка; (IE; следующее должно быть напечатано при итерации по элементам parsed.asList ())

['заголовок раздела 1:', [['некоторые слова могут быть чем угодно'], ['другими словами может быть что угодно'], ['и т. Д. Лала']]]
['какой-то другой заголовок:', [['как раньше могло быть что угодно'], ['эй, разве это не весело']]]

Имена заголовков известны заранее, и отдельные заголовки могут появляться или не появляться. Если они действительно появляются, это всегда как минимум одна строка содержимого.

Проблема, с которой я столкнулся, заключается в том, что я не могу заставить синтаксический анализатор распознать, где начинается «заголовок раздела 1:» и «какой-либо другой заголовок:». Я получаю разобранный.asList () выглядит так:

['заголовок раздела 1:', [['' некоторые слова могут быть любыми '], [' другими словами может быть что угодно '], [' и т. Д. Лала »], ['другой заголовок'] , ['' как и раньше могло быть что угодно '], [' Эй, разве это развлечение ']]]

(IE: заголовок раздела 1: отображается правильно, но все, что следует за ним, добавляется в заголовок раздела 1, включая дополнительный заголовок строки и т. д.)

Я пробовал разные вещи, по-разному играл с leaveWhitespace () и LineEnd (), но не могу понять.

Базовый парсер, над которым я работаю, - это (надуманный пример - на самом деле это определение класса и т. Д.).

header_1_line=Literal('section header 1:')

text_line=Group(OneOrMore(Word(printables)))

header_1_block=Group(header_1_line+Group(OneOrMore(text_line)))

header_2_line=Literal('some other header:')

header_2_block=Group(header_2_line+Group(OneOrMore(text_line)))

overall_structure=ZeroOrMore(header_1_block|header_2_block)

и его называют

parsed=overall_structure.parseFile()

Ура, Матф.

9
задан Matt Warren 20 February 2012 в 14:04
поделиться