Python 操作 Word:如何查找、替换和批量修改文本

于Word文档的自动化处理里头 , 查找文本以及替换文本 , 属于极基础亦是极频繁的操作当中的一种。不管是成批修改合同里的条款编号 , 亦或是更新报告里的日期信息 , 又或者是于众多文档里统一去调整术语表述 , 具备高效的文本查找替换能力 , 都是文档处理流程的核心部分。这篇文章会讲述怎样在Word文档里达成文本的查找与替换 , 包含普通文本替换 、正则表达式匹配替换以及查找之后高亮显示等实用情形。

为什么通过编程实现查找替换

在Word里手动运用查找替换功能虽说便利, 然而在如下场景当中, 编程的方式具备无法被替代的优势:

环境搭建

在开始之前,需要安装支持 Word 文档操作的 库。

复制代码
pip install Spire.Doc

安装完成后,在脚本中导入相关模块即可开始使用。

基础文本替换

把文档里头特定文本置换成全新内容这种最为基础的替换行为, () 办法获取四个参数, 分别是需查找的文本、替换之后的文本、是不是忽略大小写、是不是全词匹配。

复制代码
from spire.doc import *
from spire.doc.common import *
inputFile = "Sample.docx"
outputFile = "ReplaceText.docx"
# 创建文档对象
document = Document()
# 从磁盘加载 Word 文件
document.LoadFromFile(inputFile)
# 将文档中的 "word" 替换为 "ReplacedText"
# 参数:查找文本, 替换文本, 忽略大小写, 全词匹配
document.Replace("word", "ReplacedText", False, True)
# 保存文档
document.SaveToFile(outputFile, FileFormat.Docx)
document.Close()

按照布尔情况而言, 关于方法的第二个以及第三个参数, 其作用在于对匹配实施严格程度方面的决定, 当呈现为False的时候, 意味着在匹配过程要区分大小写, 而若呈现为True, 并且是作为第四个参数的时候, 所代表的含义是仅仅匹配完整的单词, 并非是单词其中的一部分, 这样的一种设计状况, 使得替换操作在范围匹配上能够进行精确控制, 进而避免出现误替换情况。

使用正则表达式进行替换

在需要匹配的文本具备某种模式而非固定字符串情形的时候, 正则表达式也就发挥了作用。比如说, 替换掉全部以 # 开始的标识符、匹配格式特殊的日期或者编号等等。

复制代码
from spire.doc import *
from spire.doc.common import *
import re
inputFile = "Sample.docx"
outputFile = "ReplaceByRegex.docx"
# 创建文档对象
document = Document()
# 从磁盘加载 Word 文件
document.LoadFromFile(inputFile)
# 创建正则表达式,匹配以 # 开头的单词
regex = re.compile(r"#\w+\b")
# 使用正则表达式替换匹配的文本
document.Replace(regex, "Spire.Doc")
# 保存文档
document.SaveToFile(outputFile, FileFormat.Docx)
document.Close()

在此处运用标准库 re 的 () 方法去创建正则表达式对象, 接着把该对象传递给 .() 方法。凡是匹配此模式的文本都会统一被替换成目标字符串。这种模式格外适宜用来处理具备规律性模式的文本内容, 像这样:

查找文本并高亮显示

有时, 并非要替换文本内容, 而是得定位, 所有匹配后的文本, 并且去进行视觉标记, 这在文档审核场景里, 于关键词检索结果标记等情况中, 是极为实用的。

复制代码
from spire.doc import *
from spire.doc.common import *
inputFile = "Sample.docx"
outputFile = "FindAndHighlight.docx"
# 创建文档对象
document = Document()
# 从磁盘加载 Word 文件
document.LoadFromFile(inputFile)
# 查找所有匹配的文本
textSelections = document.FindAllString("word", False, True)
# 遍历匹配结果,设置高亮颜色
for selection in textSelections:
    selection.GetAsOneRange().CharacterFormat.HighlightColor = Color.get_Yellow()
# 保存文档
document.SaveToFile(outputFile, FileFormat.Docx)
document.Close()

()这个方法返回的是一个文本选择方面的集合, 其中每一个元素所代表的是对于文档而言出现的一处匹配位置, 借助()能够获取与之相对应的文本范围, 而后再去进行访问。

设置属性的高亮颜色, 参数False意味着区分大小写, 参数True意思是进行全词匹配。

查找并替换为图片

查找到的文本可被换为图片,而非仅替换成普通文本, 这种替换方式在批量插入Logo或是批量插入签名, 又或者是批量插入多种产品图片后的特定场景里, 有着极为强大的实用性。

复制代码
from spire.doc import *
from spire.doc.common import *
inputFile = "Sample.docx"
outputFile = "ReplaceWithImage.docx"
# 创建文档对象
document = Document()
# 从磁盘加载 Word 文件
document.LoadFromFile(inputFile)
# 创建图片对象
image = DocPicture(document)
image.LoadImage("logo.png")
# 查找所有 "[LOGO]" 占位符
textSelections = document.FindAllString("[LOGO]", False, False)
# 将每个匹配位置替换为图片
for selection in textSelections:
    range = selection.GetAsOneRange()
    # 清除原文本
    range.Text = ""
    # 在原文本位置插入图片
    range.ChildObjects.Add(image.Clone())
# 保存文档
document.SaveToFile(outputFile, FileFormat.Docx)
document.Close()

这种方式常用于模板文档处理:在文档中放置占位符(如 、

),然后通过代码批量替换为实际图片。

批量处理多个文档

于实际工作内, 时常会要对目录当中的多个Word文件去执行相同的查找替换之操作, 借由的文件遍历本事, 能够达成高效的批量处置。

复制代码
import os
from spire.doc import *
from spire.doc.common import *
input_dir = "./documents"
output_dir = "./processed"
os.makedirs(output_dir, exist_ok=True)
# 遍历目录中的所有 .docx 文件
for filename in os.listdir(input_dir):
    if filename.endswith(".docx"):
        input_path = os.path.join(input_dir, filename)
        output_path = os.path.join(output_dir, filename)
        document = Document()
        document.LoadFromFile(input_path)
        # 执行替换操作
        document.Replace("旧公司名称", "新公司名称", False, True)
        document.SaveToFile(output_path, FileFormat.Docx)
        document.Close()
        print(f"已处理: {filename}")

这段代码, 于指定目录之内, 对所有的.docx 文件展开遍历之举, 随后针对每一份文档, 去执行相同的文本替换之操作, 并且把最终所获结果, 保存至输出目录之中。如此这般的模式, 于企业进行更名之时, 于术语达成统一之际, 于模板实施更新等诸多场景里面, 是极为实用的。

实用技巧使用替换回调进行精细控制

要是处于那种需要更为复杂逻辑的替换状况之下, 便能在进行替换之前, 去核查匹配内容的上下文情况, 进而决定是不是要执行替换这么个操作。

复制代码
# 先查找所有匹配项
textSelections = document.FindAllString("Python", False, True)
# 根据上下文决定是否替换
for selection in textSelections:
    range = selection.GetAsOneRange()
    # 仅在段落样式为标题时替换
    if range.OwnerParagraph.StyleName.startswith("Heading"):
        range.Text = "Python Programming"

处理替换后的格式保留

换文本之际, 原本的字符样式(字体、颜色、尺寸诸等)默认会留存, 倘若有同时更改样式之需求, 能够于替换之后再度进行设置。

复制代码
textSelections = document.FindAllString("old term", False, True)
for selection in textSelections:
    range = selection.GetAsOneRange()
    range.Text = "new term"
    range.CharacterFormat.Bold = True
    range.CharacterFormat.TextColor = Color.get_Blue()

总结

关于如何在Word文档里查找以及替换文本, 本文介绍了好些方法, 有基础文本替换的办法, 有正则表达式匹配替换的方式, 有查找后进行高亮显示的做法, 有替换为图片的举措, 还有批量文件处理的操作, 这些操作涵盖了从简单文本修改到复杂模式匹配的主要情形。

核心 API 围绕着两个方法展开, 一个方法旨在支持普通字符串与正则表达式两款匹配样式之际, 予以直接替换 ;另一方法则是用于定位匹配地方, 借由格式设定达成高亮印记等成效。当掌握了这些基础操作以后, 能够进一步结合其文件处的能力, 构建出高效的文档批量处理工作溪流。

相关推荐
weixin_440730502 小时前
allure总结--解决版本不相容,没有trend(生成原始报告+复制history后在一起生成新报告)+jenkins集成
python·测试报告·allure
小柯南敲键盘2 小时前
跨马翻译:图片翻译软件批量处理,跨境电商视频字幕AI智能抠图
人工智能·python·音视频
BYSJMG2 小时前
计算机毕业设计选题推荐|【基于大数据的植被光谱特征与环境因子关联分析及可视化】Spark+K-Means
大数据·python·信息可视化·数据分析·spark·kmeans·课程设计
茶栀(*´I`*)2 小时前
Python网络机器人入门:从Robots协议、网页结构到Requests库的基础实践
网络·python·机器人
SunnyDays10112 小时前
如何使用 Python 添加和编辑 Excel VBA 宏(无需安装 Excel)
开发语言·python·excel·vba
2601_962295992 小时前
Python+Appium 自动化测试:从基础语法到 PO 模式设计,构建稳定测试框架
自动化测试·python·appium·测试框架·po模式
开源量化GO2 小时前
先确认策略想法能不能变成规则
人工智能·python
拜托多多指教2 小时前
【Pytest框架学习】分层架构
python·pytest
zhanghaha13142 小时前
Python进阶教程:24_Markdown 转 HTML 零基础超详细教程
开发语言·python·html