正则表达式从 pdf 中提取段落并扩展到另一页

问题描述 投票:0回答:1

我是从 PDF 文件中提取数据的新手。我需要有关提取包含特定关键字的段落内容的帮助。我面临的问题是关键字所在的段落扩展到另一个页面,使用页面分隔符

\r\n\x0c
并且所有段落都用
\r\n
模式分隔。 以下是让您了解问题的附件。

enter image description here

这是 pdf 的链接 https://www.jpmorganchase.com/content/dam/jpmc/jpmorgan-chase-and-co/investor-relations/documents/annualreport-2022.pdf

我需要从“随着这些事件......”提取内容到“经济是安全可靠的。”

我将为您提供从 pdf 中提取的一小部分或相同的文本格式。

” 在全球范围内,2022 年又是面临重大挑战的一年:从可怕的乌克兰战争、日益加剧的地缘政治紧张局势(尤其是与中国的紧张局势)到政治分裂的美国。几乎所有国家都感受到了全球经济不确定性的影响,包括能源和食品价格上涨、通货膨胀率上升和市场波动,当然还有 COVID-19 的挥之不去的影响。虽然所有这些经历和相关的动荡对我们的公司、同事、客户和我们开展业务的国家产生了严重影响,但它们对整个世界也产生了影响——乌克兰人民遭受了极大的苦难,全球经济可能面临重组。顺序——要重要得多。 随着这些事件的展开,美国在其境内仍然存在分裂,其全球领导地位在境外也受到挑战。尽管如此,现在我们应该抛开分歧,与其他西方国家合作,共同捍卫民主和基本原则。 2 \x0c自由,包括自由企业。在其他重大危机时期,我们看到美国与全球其他国家合作,为了共同的事业而团结起来。这又是一个时刻,我们的国家需要在公共和私营部门共同努力,发挥领导作用,同时提高美国的竞争力,这也意味着重新确立美国为所有人提供平等机会的承诺。摩根大通是一家历史上一直跨境运作的公司,它将尽自己的一份力量,确保全球经济的安全。 ”

请帮助我提供用于提取此内容的正则表达式。

paragraph_pattern = re.compile(r'(?<=\r\n)([A-Z][^\n]+(\r\n\x0c(?!\n)[^\n]+)*)')

我尝试提供此正则表达式,但它只提供仅在单页中可用的段落内容。 我需要一个起始模式 ' ' 以 [A-Z] 开头,结束模式为 ' ' 以 (.) 结尾,此外我还需要添加上面提供的页面分隔的情况。

我使用的代码是:

import re
import textract

def extract_paragraphs_from_pdf(pdf_path, keywords):
 
paragraph_pattern = re.compile(r'(?<=\n)[A-Z].*(?:(?:\n|\r\n\x0c)(?!\n).*)*\.(?=\r\n)')

 
extracted_paragraphs = []
pdf_text = textract.process(pdf_path, method='pdftotext').decode('utf-8')
temp = repr(pdf_text)

#with open('sa.txt','w') as f:
#    f.write(temp)

matches = paragraph_pattern.findall(pdf_text)

for paragraph in matches:
    if any(f' {keyword} ' in paragraph[0].lower() for keyword in keywords):
        extracted_paragraphs.append(paragraph[0].strip())

return extracted_paragraphs

pdf_file_path = './jp.pdf'
search_keywords = ['partnership']

result_paragraphs = extract_paragraphs_from_pdf(pdf_file_path, 
search_keywords)

for res in result_paragraphs:
    print("-->>",res)
python regex text-extraction
1个回答
0
投票

请注意,不应使用

paragraph[0].lower()
,而应使用
paragraph.lower()
,否则您将得到字符串的第一个字符。

使用 re.findall 将返回列表中捕获组 1 的值

您可以使用带有捕获组的模式:

\r?\n([A-Z][^.]*(?:\.(?!\r?\n)[^.]*)*\.)(?=\r?\n)
  • \r?\n
    匹配换行符
  • (
    捕获第 1 组
    • [A-Z][^.]*
      匹配大写字符 A-Z 和点以外的可选字符
    • (?:\.(?!\r?\n)[^.]*)*
      然后重复匹配任何字符,并且仅匹配不直接跟换行符的点
    • \.
      匹配一个点
  • )
    关闭第 1 组
  • (?=\r?\n)
    正向前瞻,直接在右侧断言换行符

更新后的代码:

import re
import textract
 
def extract_paragraphs_from_pdf(pdf_path, keywords):
    paragraph_pattern = re.compile(r'\r?\n([A-Z][^.]*(?:\.(?!\r?\n)[^.]*)*\.)(?=\r?\n)')
 
    extracted_paragraphs = []
    pdf_text = textract.process(pdf_path, method='pdftotext').decode('utf-8')
 
    matches = paragraph_pattern.findall(pdf_text)
    for paragraph in matches:
        if any(f' {keyword} ' in paragraph.lower() for keyword in keywords):
            extracted_paragraphs.append(paragraph.strip())
    return extracted_paragraphs
 
 
pdf_file_path = './jp.pdf'
search_keywords = ["partnership"]
 
result_paragraphs = extract_paragraphs_from_pdf(pdf_file_path, search_keywords)
for res in result_paragraphs:
    print("-->>", res)

结果(您想要第一个,但请注意,当您过滤

 partnership 
时,您会得到 3 个结果)

© www.soinside.com 2019 - 2024. All rights reserved.