本文详解如何在 python 中对多行文本中指定关键词(不区分大小写)进行精准高亮,尤其适用于从两边界词之间提取并高亮中间内容的场景,提供健壮、可复用的函数实现及关键注意事项。
本文详解如何在 python 中对多行文本中指定关键词(不区分大小写)进行精准高亮,尤其适用于从两边界词之间提取并高亮中间内容的场景,提供健壮、可复用的函数实现及关键注意事项。
在文本处理任务中,常需从一段含有多行内容的字符串中提取两个锚点词之间的子串,并对其中特定关键词做视觉强化(如转大写、加色标等)。但直接使用 str.replace() 会因大小写敏感而失效——例如 “nIce” 或 “NICE” 不会被 “nice” 匹配到。更关键的是,原始需求强调“高亮提取出的行中的特定文本”,而非简单替换全文所有匹配项;若锚点词本身作为边界(如提取
以下是一个改进版的 highlight_between_boundaries 函数,它:
- ✅ 完全忽略大小写;
- ✅ 支持多次出现的边界词,并逐段处理中间内容;
- ✅ 仅高亮边界词之间的文本部分(不含边界词自身);
- ✅ 保持原始大小写格式,仅对目标片段执行 .upper() 高亮(便于后续扩展为 ANSI 色彩或 HTML 标签)。
def highlight_between_boundaries(text, start_word, end_word, highlight_word): """ 在 start_word 与 end_word 之间的所有文本区间内, 不区分大小写地高亮所有出现的 highlight_word(转为大写)。 Args: text (str): 原始多行文本 start_word (str): 左边界词 end_word (str): 右边界词 highlight_word (str): 待高亮的目标词 Returns: str: 处理后的文本,仅区间内目标词被大写化 """ import re # 编译忽略大小写的正则模式,用于定位边界 start_pat = re.escape(start_word) end_pat = re.escape(end_word) hl_pat = re.escape(highlight_word) result = [] pos = 0 while True: # 查找下一个 start_word(忽略大小写) start_match = re.search(start_pat, text[pos:], re.IGNORECASE) if not start_match: break start_end = pos + start_match.end() # 从 start_end 开始查找 end_word end_match = re.search(end_pat, text[start_end:], re.IGNORECASE) if not end_match: break end_start = start_end + end_match.start() end_end = start_end + end_match.end() # 提取 start_word 与 end_word 之间的内容(不含边界) inner_text = text[start_end:end_start] # 在 inner_text 中高亮 highlight_word(不区分大小写) highlighted_inner = re.sub( hl_pat, lambda m: m.group(0).upper(), inner_text, flags=re.IGNORECASE ) # 拼接:原文本至 start_word 结束 + 高亮后的中间段 + end_word 及之后 result.append(text[pos:start_end]) result.append(highlighted_inner) result.append(text[end_start:end_end]) pos = end_end # 添加剩余未处理部分 result.append(text[pos:]) return "".join(result) # 示例:处理三行文本,高亮 "error"(仅在 [START] 与 [END] 之间) sample = """Log entry 1: OK [START] Warning: invalid input Error occurred at line 42 Another error here [END] Log entry 2: Failed""" output = highlight_between_boundaries( text=sample, start_word="[START]", end_word="[END]", highlight_word="error" ) print(output)
输出效果:
Log entry 1: OK [START] Warning: invalid input ERROR occurred at line 42 Another ERROR here [END] Log entry 2: Failed
⚠️ 重要注意事项:
立即学习“Python免费学习笔记(深入)”;