小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
人生苦短,我用python。
工具
这里我们使用python-docx
库, 关于这个库的使用可以参考官方文档
使用
- 第一种:如果不在乎原有文章的格式,比如把word文档里的
需要替换的字符串
替换成我是替换后的字符串
可以使用以下代码
这种替换方式有个问题就是,不能保持原有的格式, 比如doc = docx.Document('test.docx') for paragraph in doc.paragraphs: if '需要替换的字符串' in p.text: p.text = p.text.replace('需要替换的字符串', '我是替换后的字符串') doc.save('result_test.docx')
需要替换的字符串
是带下划线并、加粗、黑体,替换之后这些格式都不存在了,但这也是最简单部分的替换方式。 - 第二种: 既然第一种有问题,那么我们想要保持原有的文档格式,怎么办?我们只能更改里面的文字块,再python-docx库中文字块叫run,特殊就是这个run并不是我们我们想象的那样是连续的,这里盗了个图,这里感谢这位博主的图。
从图中可以看出,run是paragraph的最小单元,所以待会儿取得时候我们只能拿到段落我们才能找到run,再说run得特殊性, 比如
需要替换的字符串
这几个字可能是多个run, 可能是两个run,分别是'需要替换的', '字符串'。直接上代码:
doc = docx.Document('my_template.docx')
for paragraph in doc.paragraphs:
tmp = ''
runs = paragraph.runs
for i, run in enumerate(runs):
tmp += run.text # 合并run字符串
if '需要替换的字符串' in tmp:
# 如果存在匹配得字符串,那么将当前得run替换成合并后得字符串
run.text = run.text.replace(run.text, tmp)
run.text = run.text.replace('需要替换的字符串', '我是替换后的字符串')
tmp = ''
else:
# 如果没匹配到目标字符串则把当前run置空
run.text = run.text.replace(run.text, '')
if i == len(runs) - 1:
# 如果是当前段落一直没有符合规则得字符串直接将当前run替换为tmp
run.text = run.text.replace(run.text, tmp)
以上就是两种替换方式,可以看需求使用