Python 中实现不区分大小写的文本高亮与区间标记技巧

3次阅读

本文详解如何在 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免费学习笔记(深入)”;

  • 该函数默认不修改边界词本身,仅作用于其间的文本;若需连带高亮边界词,请调整 start_end/end_start 的切片索引。
  • 正则 re.escape() 确保 start_word/end_word 中含特殊字符(如 [, .)也能安全匹配。
  • 若存在嵌套边界(如 [START]…[START]…[END]…[END]),当前逻辑按首次配对处理;如需深度嵌套支持,建议改用解析。
  • 生产环境若需终端彩色高亮,可将 m.group(0).upper() 替换为 f”33[1;31m{m.group(0)}33[0m”(红字加粗);Web 场景则可返回 {m.group(0)}

掌握此方法后,你不仅能解决多行文本中“锚点间关键词高亮”的典型需求,还可快速适配日志分析、配置提取、模板渲染等工程场景——核心在于:分离定位逻辑与高亮逻辑,用正则保障鲁棒性,以纯文本操作保证兼容性。

text=ZqhQzanResources