如何用正则表达式提取7.X类标题与后续层级标题间的文本?
正则匹配标题并合并内容解决方案
问题分析
你要处理的文本是将章节标题(如7.1 CAPITAL TITLE)与其下方的多行文本合并为一行,但之前的正则表达式没达到效果,核心问题如下:
- 未开启
re.DOTALL模式,导致.*?无法匹配换行符,抓不到标题下的多行内容 - 分组逻辑复杂且冗余,
findall返回的是分组元组而非合并后的完整内容 - 未考虑文本末尾无后续标题的情况,会遗漏最后一个标题的内容
修正后的实现代码
import re txt_extraction = """7.1 CAPITAL TITLE text here text here 7.2.2 CAPITAL TITLE""" # 正则模式:匹配标题 + 后续内容(直到下一个标题或文本结束) pattern = re.compile( r'^(7\.\d+(?:\.\d+)*\s+[A-Z\s]+)\s*(.*?)(?=^\d+\.\d+(?:\.\d+)*\s+[A-Z]|$)', re.DOTALL | re.MULTILINE ) matches = pattern.findall(txt_extraction) result_lines = [] for title, content in matches: # 清理内容:把换行、多空格替换成单个空格,再去除首尾空格 cleaned_content = re.sub(r'\s+', ' ', content).strip() # 拼接标题和内容 if cleaned_content: result_lines.append(f"{title.strip()} {cleaned_content}") else: result_lines.append(title.strip()) # 输出结果 print('\n'.join(result_lines))
代码说明
正则模式解析:
^:匹配行开头(结合re.MULTILINE)7\.\d+(?:\.\d+)*:匹配7.X/7.X.X/7.X.X.X格式的章节号\s+[A-Z\s]+:匹配标题的大写字母及空格(.*?):非贪婪匹配标题后的所有内容(开启re.DOTALL后包含换行)(?=^\d+\.\d+(?:\.\d+)*\s+[A-Z]|$):正向预查,匹配到下一个标题开头或文本结尾时停止
内容清理:用
re.sub(r'\s+', ' ', content)把所有连续空白(换行、空格、制表符)替换成单个空格,保证内容紧凑。
运行结果
7.1 CAPITAL TITLE text here text here 7.2.2 CAPITAL TITLE
内容的提问来源于stack exchange,提问作者Adem Youssef
相关产品推荐
相关产品推荐

