У меня есть текстовый файл, похожий на;
заголовок раздела 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()
Ура, Матф.