由于我真的不明白的原因,我正在使用的REST API不使用输出JSON或XML,而是使用特殊的结构化文本格式。最简单的形式
SECTION_NAME entry other qualifying bits of the entry
entry2 other qualifying bits
...
它们不是制表符分隔的,因为结构可能看似,而是以空格分隔,并且限定位可能包含带空格的单词。 SECTION_NAME与条目之间的空间也是可变的,范围从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来完成工作,但是多行记录让我感到困惑,这是一个带药物的例子:
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的前3行时,我得到错误的结果(\ n转换为实际返回以便于阅读):
['DRUG', ['D09347', 'Fostamatinib (USAN)
D09348 Fostamatinib disodium (USAN)
D09692 Veliparib (USAN']]
正如你所看到的,随后的条目总是被集中在一起,而我期望:
['DRUG', [['D09347', 'Fostamatinib (USAN)'], ["D09348", "Fostamatinib disodium (USAN)"],
['D09692', ' Veliparib (USAN)']]]
答案 0 :(得分:3)
我建议您使用基于解析器的方法。例如,Python PLY可用于手头的任务。
答案 1 :(得分:0)
最好的方法是使用正则表达式,例如:
m = re.compile('^ENTRY\s+(.*)$')
m.search(line)
if m:
m.groups()[0].strip()
对于没有输入的行,您应该使用检测到的最后一个条目。
更简单的方法是按条目分割,例如:
vals = line.split('DRUG')
if len(vals) > 1:
drug_field = vals[1].strip()