我是从 PDF 文件中提取数据的新手。我需要有关提取包含特定关键字的段落内容的帮助。我面临的问题是关键字所在的段落扩展到另一个页面,使用页面分隔符
\r\n\x0c
并且所有段落都用 \r\n
模式分隔。
以下是让您了解问题的附件。
我需要从“随着这些事件......”提取内容到“经济是安全可靠的。”
我将为您提供从 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)
请注意,不应使用
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 个结果)