парсинг многострочного текста с разбиранием - PullRequest
0 голосов
/ 05 октября 2018

Я хотел бы проанализировать многострочный текстовый файл с содержимым как

    section1:
  key1 val1
  key2  val2

section2:
  val1
  val2
val3

section3:

section4:
 somevalue

Определены заголовки разделов (section1, section2, ...).Цель состоит в том, чтобы прочитать значения в различных разделах.У меня проблемы с использованием модуля pyparsing для нескольких строк (реальная проблема гораздо сложнее, чем в этом простом примере).

Когда я использую следующий код, синтаксический анализатор ожидает в каждой строкеполный список определенных ключевых слов :

# -*- coding: utf-8 -*-

from pyparsing import Literal, ZeroOrMore, LineEnd, ParseException

FileSyntax = None

def Grammar():

    #section1:
    section1 = Literal("section1:").suppress() + ZeroOrMore(LineEnd())
    #section2:
    section2 = Literal("section2:").suppress() + ZeroOrMore(LineEnd())
    #section3:
    section3 = Literal("section3:").suppress() + ZeroOrMore(LineEnd())
    #section4:
    section4 = Literal("section4:").suppress() + ZeroOrMore(LineEnd())

    return section1 + section2 + section3 + section4


def parseFile(filename : str):

    global FileSyntax

    print("\nparse results:\n")

    try:

        TestFile = open(filename)
        testdata = "".join( TestFile.readlines())
        FileSyntax = Grammar() 
        FileSyntax.parseString(testdata)

    except ParseException as err:

        print(err.line)
        print(" "*(err.column-1) + "^")
        print("* " + str(err))       

    except Exception as e:
        import traceback
        traceback.print_exc(e)

parseFile("testdata.txt")

Как можно выполнить анализ с учетом состояния (зависит от различных разделов)?Спасибо.

1 Ответ

0 голосов
/ 05 октября 2018

Если вы напечатаете само грамматическое выражение, вы получите что-то вроде:

{{{{Suppress:("section1:") [LineEnd]...} {Suppress:("section2:") [LineEnd]...}} {Suppress:("section3:") [LineEnd]...}} {Suppress:("section4:") [LineEnd]...}}

То есть вы анализируете все заголовки разделов, но не тело разделов.Таким образом, вы, вероятно, ошибаетесь в первой строке после 'section1:'.

Кроме того, нет необходимости вызывать readlines () и затем объединять все вместе.Просто позвоните TestFile.read().Или даже лучше, pathlib.Path(test_file_name).read_text()

...