如何使用 Python 在 Word 文档中高亮指定单词

聖光之護

聖光之護

2026-06-28

389人浏览

原创

如何使用 Python 在 Word 文档中高亮指定单词

本文介绍如何利用 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 3.14.2

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 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1104

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

2071

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1185

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

8797

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1479

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1550

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

881

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

530

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1111

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PyCharm官方快速入门指南
PyCharm官方快速入门指南

共0课时 | 0人学习

Python函数定义官方教程
Python函数定义官方教程

共0课时 | 0人学习

Python 3.14.6官方文档
Python 3.14.6官方文档

共0课时 | 0人学习