查看: 168|回复: 3

Python查找替换Word文档文本的方法与代码实现

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在Word文档自动化处理中,查找和替换文本是最常见的需求之一。比如批量修改合同编号、更新报告日期、统一术语表述,手动操作不仅效率低,而且容易遗漏。用Python脚本可以精准控制匹配规则,还能集成到批量文档处理流程中。本文基于Spire.Doc库,介绍如何用Python实现对Word文档的文本查找、替换、高亮以及批量处理,覆盖正则匹配和图片替换等实用场景。

为什么选择编程方式替代Word内置查找替换

Word自带的查找替换功能适合单文档交互操作,但在以下场景中有明显局限:

批量处理:几十份文档执行相同的替换,用脚本可以一次完成。
复杂匹配:正则表达式可以匹配编号、日期、邮箱等特定模式,Word原生查找做不到。
精确控制:区分大小写、全词匹配等逻辑,脚本可以灵活配置。
流程集成:合同模板生成或报告自动化管道中,替换操作可以嵌入到整个工作流。

环境准备

需要先安装Spire.Doc库,该库支持读写Word文档。使用pip安装:
  1. pip install Spire.Doc
复制代码

安装完成后,在Python脚本中导入以下模块即可开始开发:
  1. from spire.doc import *
  2. from spire.doc.common import *
复制代码

基础文本替换

最简单的替换是固定字符串替换。Spire.Doc的Document对象提供了Replace()方法,它接受四个参数:查找文本、替换文本、是否忽略大小写、是否全词匹配。下面的代码将示例文档中的“word”替换为“ReplacedText”,并区分大小写、全词匹配:
  1. from spire.doc import *
  2. from spire.doc.common import *
  3. inputFile = "Sample.docx"
  4. outputFile = "ReplaceText.docx"
  5. document = Document()
  6. document.LoadFromFile(inputFile)
  7. # 参数:查找文本, 替换文本, 忽略大小写, 全词匹配
  8. document.Replace("word", "ReplacedText", False, True)
  9. document.SaveToFile(outputFile, FileFormat.Docx)
  10. document.Close()
复制代码

第三个参数False表示区分大小写,第四个参数True表示仅匹配完整单词,这样“word”不会匹配到“words”或“keyword”。合理设置这两个布尔值可以避免误替换。

使用正则表达式替换模式化文本

当查找目标不是固定字符串,而是符合某种模式的文本时,就需要正则表达式。例如替换所有以#开头的标签编号。先用Python标准库re.compile()创建正则对象,再传给Replace()方法:
  1. from spire.doc import *
  2. from spire.doc.common import *
  3. import re
  4. inputFile = "Sample.docx"
  5. outputFile = "ReplaceByRegex.docx"
  6. document = Document()
  7. document.LoadFromFile(inputFile)
  8. # 匹配以#开头的单词
  9. regex = re.compile(r"#\w+\b")
  10. document.Replace(regex, "Spire.Doc")
  11. document.SaveToFile(outputFile, FileFormat.Docx)
  12. document.Close()
复制代码

正则替换特别适合处理以下场景:

将形如#TAG001的标签统一替换为其他文本。
把文档中的邮箱地址替换为[REDACTED]。
将日期格式从YYYY/MM/DD转换为YYYY-MM-DD。

查找文本并高亮显示

有时我们并不想替换内容,只想把匹配到的文本标记出来,便于人工审核。FindAllString()方法可以返回所有匹配位置,然后通过CharacterFormat.HighlightColor设置高亮颜色。下面的代码将全词匹配的“word”高亮为黄色:
  1. from spire.doc import *
  2. from spire.doc.common import *
  3. inputFile = "Sample.docx"
  4. outputFile = "FindAndHighlight.docx"
  5. document = Document()
  6. document.LoadFromFile(inputFile)
  7. textSelections = document.FindAllString("word", False, True)
  8. for selection in textSelections:
  9.     selection.GetAsOneRange().CharacterFormat.HighlightColor = Color.get_Yellow()
  10. document.SaveToFile(outputFile, FileFormat.Docx)
  11. document.Close()
复制代码

FindAllString()的第二个和第三个参数同样控制大小写与全词匹配。GetAsOneRange()返回匹配到的文本范围,通过它可以直接修改字符格式。该功能适合文档审核、关键词标记等场景。

将查找到的文本替换为图片

在模板文档中,我们经常需要把[LOGO]、[SIGNATURE]之类的占位符批量替换成实际图片。可以用DocPicture加载图片,再清除原文本并插入图片克隆对象:
  1. from spire.doc import *
  2. from spire.doc.common import *
  3. inputFile = "Sample.docx"
  4. outputFile = "ReplaceWithImage.docx"
  5. document = Document()
  6. document.LoadFromFile(inputFile)
  7. image = DocPicture(document)
  8. image.LoadImage("logo.png")
  9. textSelections = document.FindAllString("[LOGO]", False, False)
  10. for selection in textSelections:
  11.     range = selection.GetAsOneRange()
  12.     range.Text = ""
  13.     range.ChildObjects.Add(image.Clone())
  14. document.SaveToFile(outputFile, FileFormat.Docx)
  15. document.Close()
复制代码

注意,这里需要先清空占位符文本,再在同一个位置插入图片对象。由于每个匹配位置都要插入独立图片,所以使用image.Clone()复制图片实例。公司Logo、签名、产品图的批量插入都可以用这个思路实现。

批量处理多个Word文档

实际项目中常常要对整个目录下的docx文件执行相同替换。结合Python的os模块遍历文件即可实现批量处理:
  1. import os
  2. from spire.doc import *
  3. from spire.doc.common import *
  4. input_dir = "./documents"
  5. output_dir = "./processed"
  6. os.makedirs(output_dir, exist_ok=True)
  7. for filename in os.listdir(input_dir):
  8.     if filename.endswith(".docx"):
  9.         input_path = os.path.join(input_dir, filename)
  10.         output_path = os.path.join(output_dir, filename)
  11.         document = Document()
  12.         document.LoadFromFile(input_path)
  13.         document.Replace("旧公司名称", "新公司名称", False, True)
  14.         document.SaveToFile(output_path, FileFormat.Docx)
  15.         document.Close()
  16.         print(f"已处理: {filename}")
复制代码

这段代码会遍历./documents下的所有.docx文件,替换“旧公司名称”为“新公司名称”,并把结果保存到./processed目录。企业更名、术语统一、批量模板更新都非常适合这种批量脚本。

实用技巧:替换回调与格式控制

有些替换场景需要根据上下文决定是否执行替换。例如只替换标题样式中的“Python”为“Python Programming”,可以先查找所有匹配项,再逐个检查段落样式:
  1. textSelections = document.FindAllString("Python", False, True)
  2. for selection in textSelections:
  3.     range = selection.GetAsOneRange()
  4.     if range.OwnerParagraph.StyleName.startswith("Heading"):
  5.         range.Text = "Python Programming"
复制代码

替换文本后,原有字符格式默认会保留。如果需要同时调整字体、颜色或加粗属性,可以在替换后直接修改CharacterFormat:
  1. textSelections = document.FindAllString("old term", False, True)
  2. for selection in textSelections:
  3.     range = selection.GetAsOneRange()
  4.     range.Text = "new term"
  5.     range.CharacterFormat.Bold = True
  6.     range.CharacterFormat.TextColor = Color.get_Blue()
复制代码

这样既能完成文本替换,又能确保新文本的视觉样式符合预期。

总结

本文覆盖了Python查找替换Word文档文本的常用方法:基础替换、正则替换、高亮标记、图片替换和批量处理。核心API围绕Replace()和FindAllString()展开,前者负责直接替换,后者负责定位匹配位置。掌握这些方法后,可以结合Python的文件处理能力搭建更复杂的文档自动化工作流,大幅减少重复性手工操作。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python查找替换Word文档文本的方法与代码实现

楼主这篇写得挺实用,正好最近在搞文档批量处理,Spire.Doc的Replace方法我试过基础替换,没想到还能配合正则和高亮,学习了。有个小问题想请教一下:免费版的Spire.Doc有没有页数或者字数限制?之前用其他库处理大文档偶尔会卡。另外最后“替换为图片”那段代码好像没贴完,image.Clo后面是不是还有内容?期待补充,谢谢分享!
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python查找替换Word文档文本的方法与代码实现

感谢楼主分享,内容很实用!之前用Python处理Word文档时主要靠docx库,但这套基于Spire.Doc的方案看起来覆盖更全面,特别是正则替换和高亮功能,正好解决我批量改报告时需要标记异常数据的痛点。 想请教两个小问题: 1. 批量处理几十份文档时,内存占用情况如何?需要频繁加载/关闭吗? 2. 图片替换占位符时,如果原文档中有多个相同的占位符,是否每个都会插入同一张图片的克隆,需要额外处理位置偏移吗? 希望楼主能再补充下性能优化方面的经验,感谢!
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python查找替换Word文档文本的方法与代码实现

谢谢楼主的详细分享!平时用Word自带的查找替换确实够用,但遇到批量文档改合同编号那种情况,手动点几十次太崩溃了。正则替换和高亮这两个功能很实用,之前用python-docx处理不了复杂匹配,看到这篇思路挺受启发的。回头试试Spire.Doc,想请教下这个库对docx和doc的兼容性怎么样?另外图片替换占位符那段,如果文档里有多个相同占位符,InsertImage的定位是不是和文本替换一样精准?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-8-23 11:23 , Processed in 0.019915 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部