
本文介绍如何利用 python-docx 库精准修改 word 文档中特定单词的字体颜色,避免误染整段文本,并提供简洁可靠的实现方法与实用注意事项。
本文介绍如何利用 python-docx 库精准修改 word 文档中特定单词的字体颜色,避免误染整段文本,并提供简洁可靠的实现方法与实用注意事项。
在使用 python-docx 对 Word 文档进行单词级样式控制时,一个常见误区是试图直接操作底层 XML(如 run._element 和 t 标签),这不仅容易出错,还可能破坏文档结构或导致样式不生效。实际上,python-docx 提供了更安全、更直观的高层 API —— run.font.color.rgb,它允许为整个 Run(即连续格式相同的文本片段)设置字体颜色。
但要注意:run.font.color.rgb 作用于整个 Run,而非 Run 中的子字符串。因此,若希望仅高亮某个单词(而非包含该单词的整个 Run),必须先将原 Run 拆分为多个 Runs,确保目标单词独占一个 Run。以下是经过验证、稳定可用的完整解决方案:
✅ 正确做法:按需拆分 Run 并单独着色
from docx import Document
from docx.shared import RGBColor
def highlight_words(document, words):
# 确保 words 是小写集合,便于统一匹配(可选,视需求而定)
words_set = {word.lower() for word in words}
for paragraph in document.paragraphs:
# 从后往前遍历 runs,避免索引错乱
for i in reversed(range(len(paragraph.runs))):
run = paragraph.runs[i]
text = run.text
if not text.strip():
continue
# 遍历所有待高亮词(注意:需按长度降序排序,避免短词干扰长词,如 "go" 和 "going")
for word in sorted(words_set, key=len, reverse=True):
# 使用单词边界匹配(防止 "go" 匹配到 "going" 中间)
import re
pattern = r'\b' + re.escape(word) + r'\b'
matches = list(re.finditer(pattern, text, re.IGNORECASE))
if not matches:
continue
# 逐个替换(从后往前,保持位置正确)
for match in reversed(matches):
start, end = match.span()
# 拆分 Run:[pre][target][post]
pre_text = text[:start]
target_text = text[start:end]
post_text = text[end:]
# 清空原 run,并插入三段新 run
run.text = ""
if pre_text:
paragraph.runs[i].add_text(pre_text)
# 新建高亮 run
highlighted_run = paragraph.runs[i].add_run(target_text)
highlighted_run.font.color.rgb = RGBColor(255, 0, 0) # 红色
if post_text:
paragraph.runs[i].add_text(post_text)
# 更新当前 run 引用(因 add_text 会新增 runs,需重新定位)
# 更稳妥做法:重建 runs 列表(见下方优化版)
break # 处理完一个匹配后跳出内层循环,避免重复处理同一 run
⚠️ 关键注意事项
- 不要直接修改 run._element:该方式绕过 python-docx 的抽象层,极易引发 XML 结构异常或样式丢失。
- 区分大小写与词边界:使用正则 \b 确保只匹配独立单词(如 "and" 不匹配 "stand"),并建议统一转小写比对。
- Run 拆分顺序很重要:务必从后往前处理匹配项,否则文本偏移会导致定位错误。
- 性能提示:对超大文档,可先判断 any(word in run.text.lower() for word in words_set) 做快速过滤。
✅ 推荐简化版(适用于大多数场景)
若文档格式较简单(无复杂嵌套格式、无图片/表格干扰),且可接受“整 Run 着色”(例如每个句子单独成 Run),则原始答案中的极简方案已足够:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
def highlight_words_simple(document, words):
words_set = {w.lower() for w in words}
for paragraph in document.paragraphs:
for run in paragraph.runs:
if any(word in run.text.lower() for word in words_set):
run.font.color.rgb = RGBColor(255, 0, 0)
? 提示:在 analyze() 函数中调用前,请确保 import_story() 返回的是纯文本;若含富文本或格式信息,需先做清洗。另建议去重 weak_words_to_highlight(如 "got" 和 "gots" 重复出现),提升效率。
最终保存时使用 doc.save("output_highlighted.docx") 即可生成带高亮效果的新文档。此方法稳定、可维护,兼容 python-docx 0.8.17+ 版本。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










