如何用Python re模块提取学术论文结果与结论间的文本?
解决正则提取论文结果与结论间斜体段落的问题
你的代码返回None主要有几个原因:
re.match仅从字符串开头匹配,目标内容不在起始位置,自然匹配失败;- 正则里的
Result少了s,和目标章节标题6. Results不匹配; - 默认模式下
.不匹配换行符,.*?无法跨多行捕获章节间内容; - 未开启多行模式时,
^仅匹配整个字符串的开头,无法定位章节行。
下面给出两种可行的实现方法:
方法1:正则匹配+提取斜体内容
使用re.search扫描整个文本,结合re.DOTALL实现跨多行匹配,再提取所有斜体段落:
import re # 模拟论文文本 text = """ 1. Introduction 背景介绍... 6. Results *实验结果显示,A组有效率达85%,显著高于B组的60%。* *进一步分析发现,变量X与Y呈显著正相关(p<0.05)。* 7. Conclusion 研究结论总结... """ # 匹配Results和Conclusion之间的所有内容 content_match = re.search(r'6\. Results(.*?)7\. Conclusion', text, re.DOTALL) if content_match: # 提取所有被*包裹的斜体段落 italic_paras = re.findall(r'\*(.*?)\*', content_match.group(1), re.DOTALL) # 输出处理后的斜体内容 for para in italic_paras: print(para.strip())
如果你的斜体是LaTeX格式的\textit{...},只需把提取斜体的正则改成r'\\textit{(.*?)}'即可。
方法2:逐行遍历(更稳定)
针对章节结构清晰的论文文本,逐行判断是否进入目标区间,再收集斜体内容:
text_lines = text.splitlines() in_target_section = False italic_paragraphs = [] for line in text_lines: stripped_line = line.strip() if stripped_line == '6. Results': in_target_section = True continue if stripped_line == '7. Conclusion': in_target_section = False break # 收集斜体行(假设斜体以*首尾包裹) if in_target_section and stripped_line.startswith('*') and stripped_line.endswith('*'): italic_paragraphs.append(stripped_line.strip('*').strip()) print(italic_paragraphs)
内容的提问来源于stack exchange,提问作者everythingispeachy
相关产品推荐
相关产品推荐

