You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用正则表达式提取指定受访者PDF访谈文本的问题求助

问题描述

我用以下代码从PDF提取访谈文本:

from pdfminer.high_level import extract_text
text = extract_text(f"C:/Users/User/Desktop/Interview1.pdf")

提取后的访谈文本结构如下(保留了换行符,这可能是代码失效的原因):

CHRIS BACON, CEO COMMERCIAL METALS COMPANY: bla bla bla...
BARBARA SMITH, SVP AND CFO, COMMERCIAL METALS COMPANY: I agree with Chris Bacon, bla bla bla bla....

JOSEPH ALVARADO: Bla bla bla bla....

我的目标是提取特定受访者的发言,受访者发言以大写姓名(可附带职位)加冒号开头。我尝试用下面的代码提取Barbara Smith的发言,但没得到结果:

Smith_text = re.findall(r'SMITH(.*):(.*):', text)

我不太懂正则表达式,求帮忙。

解决方案

你的正则表达式问题出在这几个点:

  1. 匹配逻辑错误:SMITH(.*):(.*): 试图匹配SMITH后到第二个冒号的内容,但实际你需要的是匹配到下一个受访者的开头(或文本结尾),而非第二个冒号。
  2. 未处理换行符:文本里有换行,正则默认.不匹配换行,导致跨行的发言内容被截断或匹配失败。

针对提取Barbara Smith的发言,推荐两种实用写法:

写法一:精准提取目标受访者的发言

import re

# 匹配BARBARA SMITH开头的条目,捕获冒号后的内容,直到下一个受访者开头或文本结束
pattern = r'BARBARA SMITH,.*?:(.*?)(?=\n[A-Z][A-Z ]+?:|\Z)'
smith_text = re.findall(pattern, text, re.DOTALL)
# 清理多余换行和空格
cleaned_text = [re.sub(r'\s+', ' ', part).strip() for part in smith_text]
print(cleaned_text)
  • re.DOTALL 让.可以匹配换行符,处理跨多行的发言内容
  • (?=\n[A-Z][A-Z ]+?:|\Z) 是正向预查,匹配到下一个受访者的大写姓名+冒号,或者文本结尾就停止,避免混入其他受访者的内容

写法二:通用提取所有受访者发言(可按需筛选)

如果需要提取所有受访者的发言并分类存储,用这个更灵活:

import re

# 匹配所有受访者块:姓名职位+冒号+发言内容
pattern = r'([A-Z][A-Z ,]+?:)(.*?)(?=\n[A-Z][A-Z ,]+?:|\Z)'
matches = re.findall(pattern, text, re.DOTALL)

# 整理成字典,键为受访者标识,值为发言内容
interview_dict = {}
for speaker, content in matches:
    speaker_key = speaker.strip()
    clean_content = re.sub(r'\s+', ' ', content).strip()
    interview_dict[speaker_key] = clean_content

# 提取Barbara Smith的发言
smith_text = interview_dict.get('BARBARA SMITH, SVP AND CFO, COMMERCIAL METALS COMPANY:', '')
print(smith_text)

原代码失效原因

原正则SMITH(.*):(.*):的逻辑是找SMITH后到第一个冒号的内容,再找第二个冒号前的内容,但你的文本里Barbara Smith的行只有一个冒号,后面是发言内容,所以根本匹配不到;同时没处理换行,跨行的发言也会被漏掉。

内容的提问来源于stack exchange,提问作者xxgaryxx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:15:38