Разбор структурированного текстового файла в Python (pyparsing)

По причинам, которых я действительно не понимаю, REST API, который я использую, вместо вывода JSON или XML использует особый структурированный текстовый формат. В простейшей форме

SECTION_NAME    entry  other qualifying bits of the entry
                entry2 other qualifying bits
               ...

Они не разделены табуляцией -, как может показаться в структуре, а разделены пробелом -, а уточняющие биты могут содержать слова с пробелами. Пробел между РАЗДЕЛОМ _ИМЯ и записями также может быть разным: от 1 до нескольких (6 и более )пробелов.

Также одна часть формата содержит записи вида

SECTION_NAME entry
  SUB_SECTION more information
  SUB_SECTION2 more information

Для справки, выдержка из реальных данных (некоторые разделы опущены ), что показывает использование структуры:

ENTRY       hsa04064                    Pathway
NAME        NF-kappa B signaling pathway - Homo sapiens (human)
DRUG        D09347  Fostamatinib (USAN)
            D09348  Fostamatinib disodium (USAN)
            D09692  Veliparib (USAN/INN)
            D09730  Olaparib (JAN/INN)
            D09913  Iniparib (USAN/INN)
REFERENCE   PMID:21772278
  AUTHORS   Oeckinghaus A, Hayden MS, Ghosh S
  TITLE     Crosstalk in NF-kappaB signaling pathways.
  JOURNAL   Nat Immunol 12:695-708 (2011)

Пока я пытаюсь преобразовать этот странный формат во что-то более разумное (словарь, который затем можно преобразовать в JSON ), я не знаю, что делать :слепое разбиение по пробелам приводит к беспорядку (это также влияет на информацию с пробелами ), и я не уверен, как понять, когда начинается раздел или нет. Достаточно ли манипуляций с текстом для этой работы или мне следует использовать более сложные методы?

РЕДАКТИРОВАТЬ:

Я начал использовать pyparsing для работы, но несколько строк -сбивают меня с толку, вот пример с DRUG:

 from pyparsing import *
 punctuation = ",.'`&-"
 special_chars = "\()[]"

 drug = Keyword("DRUG")
 drug_content = Word(alphanums) + originalTextFor(OneOrMore(Word(
      alphanums + special_chars))) + ZeroOrMore(LineEnd())
 drug_lines = OneOrMore(drug_content)
 drug_parser = drug + drug_lines

При применении к первым трем строкам DRUG в примере я получаю неверный результат (\n преобразуется в фактические результаты для облегчения чтения):

 ['DRUG', ['D09347', 'Fostamatinib (USAN)
        D09348  Fostamatinib disodium      (USAN)
        D09692  Veliparib (USAN']]

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

 ['DRUG', [['D09347', 'Fostamatinib (USAN)'], ["D09348", "Fostamatinib disodium (USAN)"],
           ['D09692', ' Veliparib (USAN)']]]
6
задан Einar 4 July 2012 в 15:27
поделиться