【问题标题】:Extract only the title of an article from a TXT file in Python仅从 Python 中的 TXT 文件中提取文章的标题
【发布时间】:2021-03-18 13:25:22
【问题描述】:

感谢您在以下问题上的指导。我只需要从一系列出版物中批量提取文章标题。我的想法是我收到 PDF 格式的文件,我只提取第一页(完成),批量转换为 TXT(完成),然后我被困在最后一个阶段。

TXT的结构如下:

---医学与生命杂志

JML |审查

新型多聚(ADP-核糖)抑制剂在治疗具有遗传性胚系 BRCA1/2 突变的局部晚期和转移性 Her-2/neu 阴性乳腺癌中的作用。 文献综述

作者列表等……

只需要每个文件的标题(粗体)。我可以做迭代,这不是问题。

通过下面的代码,我尝试识别第 1 段:

    data = file.read()
    array1 = []
    sp = data.split("\n\n")
    for number, paragraph in enumerate(sp, 1):
        if number == 1:
            array1 += [paragraph]
            print (array1)

没有任何结果...

我的想法是我只需要将标题保存在一个文件(可能是 TXT)中,因为我需要此列表用于其他目的。

非常感谢!

【问题讨论】:

  • sp 中的实际内容是什么?
  • 我试图分成几行...但不确定是否可以
  • 如果标题总是第三行,那么就使用sp[2]
  • @Ashish - 我做到了。没有错误,但也没有返回。只是空白。现在的代码是:for files in os.listdir(): data = file.read() array1 = [] sp = data.split("\n\n") for number, paragraph in enumerate(sp, 2): if number == 1: array1 += [paragraph] print (array1)
  • 您可以读取文件,拆分为 2 个换行符,然后从列表中获取第三项 for file in os.listdir(): data = open(file, "r") sp = data.read().split("\n\n") print(sp[2]) 或者是否有更具体的逻辑,例如获取此字符串格式 JML | REVIEW 之间的所有文本这个字符串格式Authors list, etc, etc --- ?

标签: python text extract


【解决方案1】:

您可以使用 .read() 读取整个文件,并使用带有捕获组的模式来匹配从 JML 到 Authors。

^JML\s*\|.*\s*\r?\n((?:.*\r?\n)*?)Authors\b

模式匹配:

  • ^ 字符串开始
  • JML\s*\| 匹配 JML、可选的空白字符和 |
  • .*\s*\r?\n 匹配行的其余部分、可选的空白字符和换行符
  • (捕获组1
    • (?:.*\r?\n)*? 尽可能少地匹配所有行
  • )关闭第一组
  • Authors\b作者

Regex demo

例如:

import os
import re

pattern = r"^JML\s*\|.*\s*\r?\n((?:.*\r?\n)*?)Authors\b"
array1 = []

for file in os.listdir():
    with open(file, "r") as data:
        array1 = array1 + re.findall(pattern, data.read(), re.MULTILINE)
print(array1)

【讨论】:

  • 非常感谢您出色而详细的解释。我已经尝试了代码,没有任何错误,但输出是一个空白数组“[]”,如此处所示ibb.co/fpmKf8B
  • @OviSele 您可以在这部分 with open(file 中的 file 之前添加文件的路径,因为当您在循环中执行 print(file) 时,您只会看到文件的名称。跨度>
  • 谢谢!就像我在下面做的那样?我得到相同的结果 [] for file in os.listdir(): with open('C:\\Users\\OviSele\\Downloads\\Test\\testpy.txt', "r") as data: array1 = array1 + re.findall(pattern, data.read(), re.MULTILINE) print(array1)
  • @OviSele 你使用listdir 这将Return a list containing the names of the entries in the directory given by path 然后,对于你得到的每个名字,你必须在正确的路径中打开那个文件:-) 所以我认为你的情况可能import os import re pattern = r"^JML\s*\|.*\s*\r?\n((?:.*\r?\n)*?)Authors\b" array1 = [] path = "C:\\Users\\OviSele\\Downloads\\Test\\" for file in os.listdir(path): with open(path + file, "r") as data: array1 = array1 + re.findall(pattern, data.read(), re.MULTILINE) print(array1)
  • 太棒了!非常非常感谢!谢谢一百万!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 2021-09-25
相关资源
最近更新 更多