win32com操作word 第十五 Find接口的使用
Posted 大虾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win32com操作word 第十五 Find接口的使用相关的知识,希望对你有一定的参考价值。
最近一直在忙于项目,以至于win32com的视频一直拖更。要不,书面形式更新吧。这次介绍的是Find
接口。
假如,要在一篇2万字的文章中找到某些关键词,并返回Range
对象,通常可以通过遍历段落 + 正则匹配的方式解决,伪代码如下:
import re
from win32com.client import Dispatch
client = Dispatch(\'Word.Application\')
client.Visible = 1
doc = client.Documents.Open(\'demo.doc\')
# 遍历段落 找出以“编程”开头的段落,返回Range
rng = None
for p in doc.Paragraphs:
if re.match(\'编程\', str(p)):
rng = p.Range
文章很长,这样的执行效率并不是最高的,如果要找出多个关键词呢,for
循环 + re
就显得有点慢了,当然,慢是相对的。
Find接口简单使用
此时Find
接口就可以登场了,它的实现和文档客户端中的查找
是一样的。先看看Find
接口的简单用法,伪代码演示。
Tips 该接口只能通过
Range
对象或Selection
对象调用,这两个对象是可以定义任意范围的,意味着更灵活的使用,有时候并一定需要从头到尾找一篇。
from win32com.client import Dispatch
client = Dispatch(\'Word.Application\')
client.Visible = 1
doc = client.Documents.Open(\'demo.doc\')
# 在文章中找到python的字样
rng = doc.Range()
# rng = doc.Content 也可以,两者有点不同,
# 绝大部分情况下这种不同并不会带来影响,
# 除非是在编辑书本
# 查找时忽略空格
rng.Find.IgnoreSpace = True
# 如果能找到返回True,反之False
ret = rng.Find.Execute(\'python\')
划重点
1、如果能找到关键词,rng
变成选中当前关键词,形成了一个新的Range
对象,之前所声明的rng = doc.Range()
将不复存在,反之,rng
保持不变。
2、文档有多个关键词时,Find
找到第一个时就会停止,并不会自动继续往下找,且默认向前查找。
如果想实现通篇文章查找,可通过while
循环实现,伪代码演示
from win32com.client import Dispatch
client = Dispatch(\'Word.Application\')
client.Visible = 1
doc = client.Documents.Open(\'demo.doc\')
rng_list = []
rng = doc.Range()
while True:
rng.Find.IgnoreSpace = True
ret = rng.Find.Execute(\'编程\')
if ret:
rng_list.append(rng)
else:
break
划重点
1、记得有退出循环的条件;
2、rng
不能声明在循环体中,不然ret
永远都会返回True
导致死循环。
Find接口进阶使用
在客户端的查找面板中,有通配符查找,本质上是正则,和常见的正则表达式,大部分是相同的,有某些是word
的特色。比如查找在段落末尾的“编程”字样,伪代码演示(要考虑段落末尾是否有标点符号,此处假设没有)。
rng = doc.Range()
rng.Find.IgnoreSpace = True
rng.Find.Execute(\'编程^p\')
^p
是word中段落标记的通配符表示方法,如果把段落标记使用print
打印出来,它是这样的\\r
。
不过有点遗憾的是,至今依然不知道如何使用通配符来查找出现在每个段落开头的关键词。
关于更多的通配符使用,有兴趣的可自行搜索,内容还是很丰富的。
ok,今天就先讲这么多,下回继续。我拉了一个win32com编程的交流群,想交流的可加微信:yideng6618,备注:交流群。
以上是关于win32com操作word 第十五 Find接口的使用的主要内容,如果未能解决你的问题,请参考以下文章