python - 如何解析半结构化文本(cran.all.1400)

时间:2016-12-21 11:12:55

标签: python parsing text-parsing

我需要使用cran.all.1400文本文件。

这是一篇摘自文章的摘要,其中包含有关每篇文章的一些附加数据。它的形式如下:

.I 1
.T
空气动力学实验研究 机翼在滑流中。
.A
brenckman,米。
.B
学家AE。特战队。 25,1958,324 .W
//很多文字
.I 2
.T
在不可压缩的小流体中通过平板的简单剪切流 粘度 .A
廷伊利
.B
伦斯勒理工学院航空工程系 研究所 特洛伊,是的 .W
//很多文字


等等。

我需要的是如此组织的数据:

第1条:.T =“无论第1条的标题是什么”,.A =“w / e作者是”,。B =“w / e”,。T =“所有文本”
第2条:.T =“无论标题是什么”,.A =“w / e作者是”,.B =“w / e”,。T =“所有文本”

我将如何在Python中执行此操作? 谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

.I分裂的评论中你的想法似乎是一个好的开始。

以下似乎有效:

with open('crantest.txt') as f:
    articles = f.read().split('\n.I')

def process(i, article):
    article = article.replace('\n.T\n','.T=')
    article = '.T=' + article.split('.T=')[1] #strips off the article number, restored below
    article = article.replace('\n.A\n',',.A=')
    article = article.replace('\n.B\n',',.B=')
    article = article.replace('\n.W\n',',.W=')
    return 'article ' + str(i) + ':' + article

data = [process(i+1, article) for i,article in enumerate(articles)]

我创建了一个仅包含前10篇文章的测试文件(丢弃一个小标题和所有以.I 11开头的文件)。当我运行上面的代码时,我得到一个长度为10的列表。重要的是第一行开始.I(没有先前的换行符),因为我没有努力测试拆分的第一个条目是否为空。列表中的第一个条目是一个开头的字符串:

article 1:.T=experimental investigation of the aerodynamics of a\nwing in a slipstream .,.A=brenckman,m.,.B=j. ae. scs. 25, 1958, 324.,.W=experimental investigation of the aerodynamics of a\nwing in a slipstream

On Edit 这是一个字典版本,它使用partition连续拉出相关的块。它返回字典字典而不是字符串列表:

with open('crantest.txt') as f:
    articles = f.read().split('\n.I')

def process(article):
    article = article.split('\n.T\n')[1]
    T, _, article = article.partition('\n.A\n')
    A, _, article = article.partition('\n.B\n')
    B, _, W = article.partition('\n.W\n')
    return {'T':T, 'A':A, 'B':B, 'W':W}

data = {(i+1):process(article) for i,article in enumerate(articles)}

例如:

>>> data[1]
{'A': 'brenckman,m.', 'T': 'experimental investigation of the aerodynamics of a\nwing in a slipstream .', 'B': 'j. ae. scs. 25, 1958, 324.', 'W': 'experimental investigation of the aerodynamics of a\nwing in a slipstream .\n  an experimental study of a wing in a propeller slipstream was\nmade in order to determine the spanwise distribution of the lift\nincrease due to slipstream at different angles of attack of the wing\nand at different free stream to slipstream velocity ratios .  the\nresults were intended in part as an evaluation basis for different\ntheoretical treatments of this problem .\n  the comparative span loading curves, together with\nsupporting evidence, showed that a substantial part of the lift increment\nproduced by the slipstream was due to a /destalling/ or\nboundary-layer-control effect .  the integrated remaining lift\nincrement, after subtracting this destalling lift, was found to agree\nwell with a potential flow theory .\n  an empirical evaluation of the destalling effects was made for\nthe specific configuration of the experiment .'}

s.partition()返回一个三元组,该字符串由第一次出现分隔符之前的字符串s的一部分,分隔符本身以及分隔符出现后字符串的一部分组成。代码中的下划线(_)是一个Python习语,它强调打算丢弃返回值的那一部分。