如何用正则表达式捕获文档中的段落标题及对应文本?
解决方案:提取标题与对应内容的正则写法
我来帮你搞定这个文本提取的问题!你想要把标题(比如paraTitle-1)和它下面的内容对应起来,之前的正则没成功是因为没有处理好多行匹配和边界区分的问题,我给你梳理一下正确的思路和代码:
问题分析
你的文本结构是:
paraTitle-1 --------
若干行内容(均属于paraTitle-1)
paraTitle-2 --------
若干行内容(均属于paraTitle-2)
核心是要匹配标题→分隔线→内容,直到下一个标题出现,之前的正则(?<=(.*))----*(?=(.*))没有明确区分标题和内容的边界,而且默认的正则模式不处理换行,导致匹配不到多行内容。
正确的正则表达式
我们可以用这个正则(配合多行和点匹配换行的模式):
^(.+?)\s*-+\s*(.*?)(?=^\S|\Z)
正则各部分解释:
^:在re.MULTILINE模式下匹配每一行的开头(.+?):非贪婪匹配标题内容(直到遇到分隔线),避免把后面的内容也吞进去\s*-+\s*:匹配分隔线,允许前后有空白字符,-+表示至少一个短横线(你可以改成-{4,}来匹配至少4个短横线,避免标题里的单个短横线被误判)(.*?):非贪婪匹配内容,直到遇到下一个标题((?=^\S)下一行开头是非空白字符,即新标题)或者文本结束(\Z)- 配合
re.DOTALL让.匹配换行符,这样能捕获多行内容
代码示例(Python)
用Python实现提取并生成字典(对应你要的键值对数组结构):
import re # 示例文本 text = """paraTitle-1 -------- 这是paraTitle-1的第一行内容 这是第二行内容,换行也能捕获 paraTitle-2 -------- 这是paraTitle-2的内容, 可能有多行,包含各种字符 """ # 编译正则,开启多行和点匹配换行模式 pattern = re.compile(r'^(.+?)\s*-+\s*(.*?)(?=^\S|\Z)', re.DOTALL | re.MULTILINE) # 找到所有匹配 matches = pattern.findall(text) # 转换成字典,去除前后空白 result = {title.strip(): content.strip() for title, content in matches} print(result)
运行后输出的结果就是你想要的结构:
{ 'paraTitle-1': '这是paraTitle-1的第一行内容\n这是第二行内容,换行也能捕获', 'paraTitle-2': '这是paraTitle-2的内容,\n可能有多行,包含各种字符' }
注意事项
- 如果标题里包含短横线,建议把分隔线的正则改成
\s-{4,}\s*(匹配至少4个短横线),这样标题里的单个短横线不会被当成分隔线 - 如果你的文本有其他特殊格式(比如标题开头有固定前缀),可以调整
^(.+?)部分来精准匹配标题
内容的提问来源于stack exchange,提问作者user134611




