You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python正则匹配中重叠引用区间的合并方法

解决重叠引用匹配的合并问题

要解决重叠/包含的引用匹配结果合并问题,核心思路是先统一处理匹配的区间范围,再提取完整文本,具体步骤如下:

  1. 收集所有正则匹配的起止索引,暂时忽略匹配文本(后续直接从原文本截取更准确的完整内容)
  2. 按起始索引排序,保证可以顺序遍历合并区间
  3. 合并重叠或包含的区间,保留覆盖范围最大的区间
  4. 用合并后的区间从原文本中截取完整引用文本

完整代码实现

from re import finditer

def get_references(text, references_regex):
    # 收集所有匹配的起止索引
    matches = []
    for ref_regex in references_regex:
        for match in finditer(ref_regex, text):
            start, end = match.span()
            matches.append((start, end))
    
    if not matches:
        return []
    
    # 按起始位置排序,确保合并顺序正确
    matches.sort(key=lambda x: x[0])
    
    # 合并重叠/包含的区间
    merged_intervals = [list(matches[0])]
    for curr_start, curr_end in matches[1:]:
        last_start, last_end = merged_intervals[-1]
        # 当前区间与上一个合并区间重叠或被包含,则扩展结束位置
        if curr_start <= last_end:
            merged_intervals[-1][1] = max(last_end, curr_end)
        else:
            merged_intervals.append([curr_start, curr_end])
    
    # 从原文本截取合并后区间的完整文本,生成最终结果
    return [
        {
            'text': text[start:end],
            'span': {'start': start, 'end': end}
        }
        for start, end in merged_intervals
    ]

代码说明

  • 区间收集:遍历所有正则模式,记录每个匹配的起始和结束索引,避免被不同正则匹配的子串干扰
  • 排序:确保我们按文本顺序处理区间,不会出现跨区间合并的错误
  • 合并逻辑:逐个检查当前区间与已合并的最后一个区间,若重叠或包含则扩展结束位置,否则新增独立区间
  • 文本截取:直接用合并后的区间从原文本取内容,保证得到的是完整的长引用,而非正则匹配的子串

针对你的示例效果

假设原文本中756-796的内容是Schedule 15.1 of the Framework Agreement,合并后会自动保留这个完整区间,替代原来两个重叠的子匹配结果,最终输出与你的期望完全一致。

内容的提问来源于stack exchange,提问作者Arctic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:25:29