如何使用Regex提取结构化文本中编号不固定的ABC完整章节
解决方案
核心思路是匹配ABC所在的一级章节开头,自动识别章节编号后抓取所有归属该章节的内容,直到下一个一级章节或文档结束为止。
适配任意编号的正则规则
需要同时开启 re.MULTILINE 和 re.DOTALL 两个匹配模式,正则表达式如下:
^\s*(\d+)\. *ABC.*?(?=\n\s*\d+\. |\Z)
规则说明
^\s*(\d+)\. *ABC:匹配行开头(支持行前有空格)的一级章节标题,识别出标题为ABC的一级章节并捕获对应的章节编号.*?:非贪婪匹配任意字符(含换行,由re.DOTALL支持)(?=\n\s*\d+\. |\Z):正向预查,匹配到下一个一级章节开头或文档末尾时停止,避免抓取其他章节内容
Python 实现示例
import re def extract_abc_section(doc): pattern = r'^\s*(\d+)\. *ABC.*?(?=\n\s*\d+\. |\Z)' match_result = re.search(pattern, doc, flags=re.MULTILINE | re.DOTALL) return match_result.group().strip() if match_result else "未找到ABC章节" # 测试示例1 document1 = '1. Hello world\n1.1 bla bla bla\n1.2 more bla bla\n1.3 even more bla bla ABC\n\n2. ABC \n2.1 hello ABC\n2.2 bla bla bla\n\n3. XYZ\n3.1 bla bla\n3.2 more bla bla\n3.3 even more bla bla' print(extract_abc_section(document1)) # 测试示例2 document2 = '1. Hello world\n1.1 bla bla bla\n1.2 more bla bla\n1.3 even more bla bla ABC\n\n2. XYZ\n2.1 bla bla\n2.2 more bla bla\n2.3 even more bla bla\n\n\n3. MNO\n 3.1 hello MNO\n3.2 bla bla bla\n\n\n4. ABC\n4.1 hello ABC\n4.2 bla bla bla' print(extract_abc_section(document2))
效果说明
- 自动适配ABC章节的任意一级编号位置,无需提前知道章节号
- 不会误匹配子章节内容中出现的ABC字样,仅识别标题为ABC的一级章节
- 兼容行前多余空格、章节名后多余空格等格式不统一的场景
- 支持ABC章节处于文档末尾的场景
内容的提问来源于stack exchange,提问作者Wiliam
相关产品推荐
相关产品推荐

