用Python解析结构化文本文件(pyparsing)

2024-10-01 15:46:40 发布

您现在位置:Python中文网/ 问答频道 /正文

出于我真的不明白的原因,我使用的restapi没有输出JSON或XML,而是使用了一种特殊的结构化文本格式。最简单的形式

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

它们不是制表符分隔的,就像结构看起来的那样,而是空格分隔的,并且限定位可能包含带空格的单词。SECTION_NAME和条目之间的空格也是可变的,从1到几个(6个或更多)空格。在

另外,格式的一部分包含表单中的条目

^{pr2}$

作为参考,实际数据的摘录(部分章节省略),其中说明了结构的使用:

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

当应用于示例中的前3行药物时,我得到了一个错误的结果(\n转换为实际返回值以便于阅读):

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

如您所见,后面的条目被集中在一起,而我预计:

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

Tags: namejson格式条目空格druginnusan
2条回答

最好的方法是使用正则表达式,例如:

m = re.compile('^ENTRY\s+(.*)$')
m.search(line)
if m:
   m.groups()[0].strip()

对于没有输入的行,应该使用您检测到的最后一个条目。在

更简单的方法按条目划分,例如:

^{pr2}$

我建议您使用基于解析器的方法。例如,Python PLY可用于手头的任务。在

相关问题 更多 >

    热门问题