使用正则表达式提取指定受访者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)
我不太懂正则表达式,求帮忙。
解决方案
你的正则表达式问题出在这几个点:
- 匹配逻辑错误:
SMITH(.*):(.*):试图匹配SMITH后到第二个冒号的内容,但实际你需要的是匹配到下一个受访者的开头(或文本结尾),而非第二个冒号。 - 未处理换行符:文本里有换行,正则默认
.不匹配换行,导致跨行的发言内容被截断或匹配失败。
针对提取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
相关产品推荐
相关产品推荐

