仅从Python中的TXT文件中提取文章标题

仅从Python中的TXT文件中提取文章标题,python,text,extract,Python,Text,Extract,我将感谢您对以下问题的指导。我只需要从一系列出版物中批量提取文章标题。我的想法是,我接收PDF格式的文件,我只提取第一页(完成),批量转换为TXT(完成),我被困在最后阶段 TXTs的结构如下所示: ---医学与生命杂志 JML审查 新型聚(ADP核糖)抑制剂在治疗遗传性生殖系BRCA1/2突变的局部晚期和转移性Her-2/neu阴性乳腺癌中的作用。 文献综述 作者名单等--- 只需要每个文件的标题(粗体)。我可以进行迭代,这不是问题 使用下面的代码,我试图识别第1段: data = f

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

TXTs的结构如下所示:

---医学与生命杂志

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),因为我需要这个列表用于其他目的


非常感谢

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

^JML\s*\|.*\s*\r?\n((?:.*\r?\n)*?)Authors\b
模式匹配:

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

例如:

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)

sp
中的实际内容是什么?我试着分成几行…不确定是否可以,如果标题总是第三行,那么就使用
sp[2]
@Ashish-我做到了。没有错误,但也没有返回。一片空白。代码现在是:
对于os.listdir()中的文件:data=file.read()array1=[]sp=data.split(\n\n”)表示枚举(sp,2)中段落的数字:如果数字==1:array1+=[段落]打印(array1)
您可以读取该文件,在2行换行符上拆分,然后从os.listdir()中的文件列表
中取出第3项:data=open(file,“r”)sp=data.read().split(“\n\n”)print(sp[2])
,或者是否有更具体的逻辑,比如获取此字符串格式
JML | REVIEW
和此字符串格式
作者列表之间的所有文本,等等,等等--
?非常感谢您的精彩和详细的解释。我已经尝试了代码,没有任何错误,但是输出是一个空白数组“[]”,如@OviSele所示,您可以使用open(file)
在本部分
中的
文件
之前预先设置文件路径,因为当您执行
打印(file)时
在循环中,您只能看到文件名。谢谢!就像我在下面所做的那样?对于os.listdir()中的文件,我得到了相同的结果[]
:使用open('C:\\Users\\OviSele\\Downloads\\Test\\testpy.txt',“r”)作为数据:array1=array1+re.findall(pattern,data.read(),re.MULTILINE)print(array1)
@OviSele您使用它将
返回一个列表,其中包含路径给定目录中条目的名称
然后,对于您获得的每个名称,您必须以正确的路径打开该文件:-),因此我认为在您的情况下,
import-os-import-re-pattern=r“^JML\s*.\r*\n((?:..\r?\n)*?)Authors\b”array1=[]path=“C:\\Users\\OviSele\\Downloads\\Test\\”for os.listdir(path)中的文件:打开(path+file,“r”)作为数据:array1=array1+re.findall(pattern,data.read(),re.MULTILINE)打印(array1)
!非常非常感谢!万分感谢!