本文详解如何在 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"\033[1;31m{m.group(0)}\033[0m"(红字加粗);Web 场景则可返回 {m.group(0)}。
掌握此方法后,你不仅能解决多行文本中“锚点间关键词高亮”的典型需求,还可快速适配日志分析、配置提取、模板渲染等工程场景——核心在于:分离定位逻辑与高亮逻辑,用正则保障鲁棒性,以纯文本操作保证兼容性。










