You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用正则表达式捕获文档中的段落标题及对应文本?

解决方案:提取标题与对应内容的正则写法

我来帮你搞定这个文本提取的问题!你想要把标题(比如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

火山引擎 最新活动