当前位置: 首页 > article >正文

怎么从休学证明中取出休学原因(python自动化办公,涉及word和excel)

怎么从休学证明中取出休学原因(python自动化办公,涉及word和excel)

本代码偏向处理高校教务处的工作

休学或请假模板如下:

                                         休学证明(此联存教务办)
                                            编号:休202323
计算机系23级计算机科学与技术本科专业学生5-StarrySky,不男不女,因自身原因,从2023年9月至2027年9
月休学。复学时持复学申请和休学证明及休学期间所在单位开具的无违法乱纪行为证明办理复学手续。复学
后编入2027级同专业就读。若逾期两周不办理复学手续,将做自动退学处理。
                                          CSDN大学教务办
2023年11月12日

需求说明:

1.首先从excel中取出需要休学的姓名
2.然后利用得到姓名去word文件进行匹配
3.最后通过观察发现,休学原因,在'因'和','之间,所以我们这样去取我们想要的数据

代码如下:

		import re
    	# 从表格文件中提取姓名数据
        table_data = pd.read_excel("休学名单.xls")
        # names = table_data["XM"]


        # 从表格文件中提取姓名数据
        names = table_data["XM"]

        # 提取 Word 文档中的文本
        text = docx2txt.process("休学证明.docx")

        # 创建一个字典来存储姓名和对应的请假原因
        name_reason_dict = {}

        for name in names:
            found = False
            reason = None
            # 在提取的文本中搜索姓名
            if name in text:
                # 查找姓名出现的最后一次位置
                name_position = max([m.start() for m in re.finditer(name, text)])
                # 查找 "因" 和截取到 "," 之前的文本
                match = re.search(r'因(.*?),', text[name_position:])
                if match:
                    reason = match.group(1)
                    found = True
            if found:
                # 使用姓名作为键,保存最后一个匹配到的原因
                name_reason_dict[name] = reason

        # 打印姓名和对应的请假原因
        for name, reason in name_reason_dict.items():
            print(f"姓名: {name}, 请假原因: {reason}")
        df = DataFrame(list(name_reason_dict.items()), columns=['XM', 'XXYY'])
        df.to_excel("休学证明.xlsx")

重要知识点补充

docx2txt:
将docx文件转换为txt格式的模块
能够直接读取docx文档并将其中的文本部分剥离出来的简单工具

re.finditer:
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
参数	描述
pattern	匹配的正则表达式
string	要匹配的字符串。
flags	标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
* 字符匹配
实例	描述
python	匹配 "python" 参考网址:https://www.runoob.com/python/python-reg-expressions.html

max([m.start() for m in re.finditer(name, text)])
这行代码是使用 Python 的正则表达式模块(re)来在文本字符串 text 中查找所有匹配 name 的位置,并返回其中最
大的位置。
具体解释如下:
re.finditer(name, text):这部分使用 re.finditer() 函数来查找在 text 中所有匹配 name 的位置。finditer() 返回一个迭
代器,迭代器的每个元素是一个包含匹配的相关信息的 Match 对象。
[m.start() for m in ...]:这部分是一个列表推导式,它遍历 re.finditer() 返回的 Match 对象列表,对于每个 Match 对
象 m,取其匹配的开始位置 m.start()。
max([...]):最后,max() 函数用来从位置列表中找到最大的位置。

match = re.search(r'因(.*?),', text[name_position:])
这行代码使用正则表达式来搜索文本中以指定字符串 "因" 开头并以逗号 "," 结尾的文本段。
具体解释如下:
re.search(pattern, text):这部分使用 re.search() 函数来在文本字符串 text 中搜索与正则表达式 pattern 匹配的部
分。pattern 是正则表达式模式,text 是要搜索的文本。
r'因(.*?),':这是正则表达式模式。它的含义是:
因:匹配字面字符串 "因"。
(.*?):这是一个非贪婪捕获组,它会匹配任意字符(.)零次或多次(*),使匹配最短(非贪婪)。
,:匹配字面字符串 ","。
text[name_position:]:这部分是对 text 字符串的切片操作,从 name_position 位置开始提取子字符串。

list(name_reason_dict.items()): 这部分将字典 name_reason_dict 中的键值对转换为一个列表,其中每个元素是一个
元组,元组的第一个元素是姓名 'XM',第二个元素是请假原因 'XXYY'。这个列表看起来像下面这样
[('姓名1', '请假原因1'), ('姓名2', '请假原因2'), ('姓名3', '请假原因3'), ...]
columns=['XM', 'XXYY']: 这是在创建 DataFrame 时指定的列名。DataFrame 的第一列将命名为 'XM',第二列将命
名为 'XXYY',这与字典中的键对应。所以,在 DataFrame 中,第一列将包含姓名,第二列将包含请假原因。

match 是一个 Python 正则表达式匹配对象,它包含了与正则表达式匹配的文本的详细信息。
reason = match.group(1):用于从正则表达式匹配中获取文本中的具体部分。在这个特定的情况下,match 对象表
示一个成功的正则表达式匹配,group(1) 用于提取匹配中的第一个捕获组(通常由括号包围的部分)。在你的情况
下,正则表达式是 '因(.*?),',其中 (.*?) 表示一个捕获组,它将匹配 "因" 和 "," 之间的任何文本。
参考链接:https://blog.csdn.net/m0_37360684/article/details/84140403

http://www.kler.cn/a/108307.html

相关文章:

  • Bash Shell知识合集
  • Android `android.graphics` 包深度解析:架构与设计模式
  • 2、C#基于.net framework的应用开发实战编程 - 设计(二、三) - 编程手把手系列文章...
  • 【Unity3D】ECS入门学习(六)状态组件 ISystemStateComponentData
  • 云原生架构中的中间件容器化:优劣势与实践探索
  • QT-------认识QT
  • 精讲双向链表的销毁
  • 【算法|动态规划 | 01背包问题No.1】AcWing 426. 开心的金明
  • springboot 项目非docker 部署自动启动
  • 【教3妹学编程-java实战5】结构体字段赋值的几种方式
  • 推理还是背诵?通过反事实任务探索语言模型的能力和局限性
  • [双指针](一) Leetcode 283.移动零和1089.复写零
  • 2.MySQL的调控按钮——启动选项和系统变量
  • 什么是离岸金融 (OFFSHORE FINANCE)
  • 关于FTP的一些往事
  • Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第四章 C++多线程系统编程精要
  • 数据库简史:多主数据库架构的由来和华为参天引擎的机遇
  • [算法]求n!在m进制下末尾有多少个0
  • Redis(09)| Reactor模式
  • Vue 数据绑定 和 数据渲染
  • 分布式消息队列:RabbitMQ(1)
  • [ROS系列]ubuntu 20.04 从零配置orbslam3(无坑版)
  • 广州华锐互动:VR虚拟现实物理学习平台,开启数字化教学新格局
  • acwing 5283. 牛棚入住
  • 应用案例|基于三维机器视觉的机器人引导电动汽车充电头自动插拔应用方案
  • 怎么降低Linux内核驱动开发的风险?