新浪博客

Python学习记录——正则表达式匹配与Word文档操作

2019-12-26 09:32阅读:
需求:将原始Word文档以一定结构重新整理生成一份新的Word文档。 原始Word文档结构如下:
Python学习记录——正则表达式匹配与Word文档操作
新的Word文档的结构要求:
提取出生字表中的汉字,排列在一起。提取出对应的拼音,排列在一起,以-字符间隔。
Python学习记录——正则表达式匹配与Word文档操作


实现:用正则表达式匹配原始Word文档中的汉字和拼音,分别存储为新的Word文档中的段落。
首先要引入处理正则表达式的re库和处理Word文档的docx库。
import re
SPAN>docx
定义两个变量,file存储原始Word文档,new_file存储新生成的Word文档。
file = docx.Document('E:\original.docx')
new_file = docx.Document()
然后定义一些匹配规则:
#匹配所有不是汉字的字符,包括:括号、不可见字符、中文标点符号、数字、字母、拼音
rule = re.compile(r'[()]|\s|[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b]|[0-9]|\b[a-z]*[āáǎàōóǒòêēéěèīíǐìūúǔùǖǘǚǜüńňǹɑbcdefghijklmnopqrstuwxyz]*[a-z]*\b')
#匹配所有不是字母和拼音的字符,包括:右括号、不可见字符、中文标点符号、数字、汉字
rule1 = re.compile(r'[)]|\s|[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b]|[0-9]|[\u4e00-\u9fa5]')
#匹配左括号
rule2 = re.compile(r'[(]')
#匹配各年级
#rule1 = re.compile(r'^[一二三四五六]')
#匹配具体的词:识字,课文
rule3 = re.compile(r'^[识字]|^课文')
定义两个字符串,new_text用来存储整理之后的汉字,new_text1用来存储整理之后的拼音。
#new_text用来存储汉字
new_text = ''
#new_text1用来存储拼音
new_text1 = ''
下面是程序的核心部分:
para表示原始文档中的一段,按照段落匹配正则表达式的各种规则。
注意:
(1)para.text.endswith('个')是用来判断一个字符串是不是以'个'这个字符结尾。也可以用正则表达式匹配的方法:re.match(rule1, para.text), rule1的定义是rule1 = re.compile(r'^[一二三四五六]')这里^表示Not.
(2)new_text1 = re.sub(rule2, '-', new_text1) 这里用了将拼音的左括号(替换成连字符-的方法,所以在写入new_file的时候,要将new_text1开头的第一个连字符去掉。去掉的方法是new_text1[1:],这里表示从new_text1这个字符串的第1个字符开始(而不是从第0个字符开始),类似地,如果想去掉最后一个字符,可以用new_text1[:-1]表示。
(3)将整理好的段落加入到新文档new_file里:用new_file.add_paragraph(para.text)添加原始文档中的标题文字,用new_file.add_paragraph(new_text)添加汉字段落,用new_file.add_paragraph(new_text1[1:])添加拼音段落。
(4)用下面的continue的方法过滤掉“识字”、“课文”这样的不需要的段落。
if re.match(rule3, para.text):
continue
for para in file.paragraphs:
if para.text.endswith('个'):
#if re.match(rule1, para.text): 这是正则表达式的匹配方法
if len(new_text) > 0:
new_file.add_paragraph(new_text)
new_text = ''
new_file.add_paragraph(new_text1[1:])
new_text1 = ''
new_file.add_paragraph(para.text)
elif re.match(rule3, para.text):
continue
else:
new_text = new_text + re.sub(rule, '', para.text)
new_text1 = new_text1 + re.sub(rule1, '', para.text)
new_text1 = re.sub(rule2, '-', new_text1)
new_file.add_paragraph(new_text)
new_file.add_paragraph(new_text1[1:])
最后将整理好的文件存到指定路径。
new_file.save('E:ewfile.docx')

我的更多文章

下载客户端阅读体验更佳

APP专享