Python正则匹配中重叠引用区间的合并方法
解决重叠引用匹配的合并问题
要解决重叠/包含的引用匹配结果合并问题,核心思路是先统一处理匹配的区间范围,再提取完整文本,具体步骤如下:
- 收集所有正则匹配的起止索引,暂时忽略匹配文本(后续直接从原文本截取更准确的完整内容)
- 按起始索引排序,保证可以顺序遍历合并区间
- 合并重叠或包含的区间,保留覆盖范围最大的区间
- 用合并后的区间从原文本中截取完整引用文本
完整代码实现
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
相关产品推荐
相关产品推荐

