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

使用Python与正则表达式高效提取Excel中的票号数据

使用Python与正则表达式高效提取Excel中的票号数据

一、需求

本文将介绍如何利用Python的Pandas库和正则表达式,快速实现票号这一数据清洗任务,并将结果整理为规范的表格结构。

在数据处理场景中,从非结构化文本里提取特定格式的信息是常见需求。例如在物流工单、票务系统的Excel记录中,我们经常需要从冗长的摘要文本里提取出票号(如快递单号、订单号等)。
在这里插入图片描述

二、核心代码解析

我们通过一段实际代码来演示整个处理流程,代码逻辑分为数据读取正则匹配结果整理三个核心步骤。

1. 导入依赖库

import pandas as pd
import re
  • pandas:用于Excel文件的读写和数据处理
  • re:正则表达式模块,用于文本模式匹配

2. 读取原始数据

df = pd.read_excel('报销.xlsx')
  • 使用pd.read_excel读取原始Excel文件,假设数据存储在默认的第一个工作表
  • 原始数据结构:假设第一列为包含票号的摘要文本(如“处理票号1234567890的问题”)

3. 预编译正则表达式

ticket_pattern = re.compile(r'\b\d{8,30}\b')
  • 模式解析
    • \b:单词边界,确保匹配独立数字串
    • \d{8,30}:匹配8到30位的连续数字(可根据实际票号长度调整)
  • 预编译优势:避免重复编译正则表达式,提升匹配性能

4. 遍历文本并提取票号

result_data = []
for text in df.iloc[:, 0].astype(str):tickets = ticket_pattern.findall(text)if tickets:# 处理第一条记录(包含摘要和首个票号)result_data.append({'摘要': text, '票号': tickets[0]})# 处理剩余票号(摘要留空)result_data.extend({'摘要': '', '票号': ticket} for ticket in tickets[1:])else:# 无票号时保留摘要result_data.append({'摘要': text, '票号': ''})
  • 关键逻辑
    • df.iloc[:, 0]:选取第一列数据(假设票号在第一列)
    • astype(str):确保所有数据转为字符串类型,避免类型错误
    • findall方法:返回所有匹配的票号列表
    • 数据结构设计
      • 首个票号保留对应的摘要文本
      • 后续票号共享同一摘要(摘要留空以节省空间)
      • 无票号记录保留原始摘要,票号字段为空

5. 保存结果到Excel

pd.DataFrame(result_data).to_excel('output4.xlsx', index=False)
  • 将结果列表转换为DataFrame并保存为新Excel文件
  • index=False参数:禁止生成默认行索引列

三、技术关键点

1. 正则表达式优化技巧

  • 动态调整匹配模式:若票号包含字母(如“YT123456”),可修改模式为:
    r'\b[A-Za-z0-9]{8,30}\b'  # 匹配字母数字混合字符串
    
  • 边界控制:使用\b避免匹配长数字串中的子串(如从“123456789012”中提取完整票号,而非截断部分)

2. Pandas数据处理技巧

  • 向量化操作:虽然本例使用循环遍历,对于大规模数据可尝试向量化处理(如df[0].apply())以提升速度
  • 数据类型管理:通过astype(str)统一处理可能的数值型、日期型数据,避免正则匹配错误

3. 多票号处理逻辑

  • 当单条摘要包含多个票号时(如“涉及票号123456和789012”),代码会将首个票号与摘要关联,后续票号以“摘要为空+独立票号”的形式展示,便于后续数据统计。

需要源码的,加同名ggh,进行获取
在这里插入图片描述

http://www.xdnf.cn/news/6483.html

相关文章:

  • 2.Klipper开发篇:Klipper上位机源码分析
  • 时源芯微|TSFE0806U-2L-900TF复合共模滤波器在USB端口保护
  • Python函数参数传递机制深度解析:值传递与引用传递的真相
  • 理解c++中关键字友元friend的作用
  • 盲盒:拆开未知的惊喜,收藏生活的仪式感
  • 现代生活中的创新健康养生之道
  • LLM笔记(二)LLM数据基础
  • 【C++】Module CPP:模块化编程 Demo
  • 【C#】Thread.Join()、异步等待和直接join
  • C++delete详解剖析
  • 工具类来生成蓝牙指令
  • Java 序列化(Serialization)
  • 奇妙协同效应,EtherNet IP与PROFINET网关优化半导体生产线
  • Git .gitattributes 文件用途详解
  • Baklib知识中台驱动智能服务新实践
  • ZCC6303x-60V/1.2MHz 高效率升压 LED 恒流驱动替代SY7301
  • 【图片识别工具】批量单据识别批量重命名,批量OCR识别图片文字并重命名,批量改名工具的使用步骤和注意事项
  • Modbus TCP转Profinet网关:数字化工厂异构网络融合的核心枢纽
  • pciutils-3.5.5-win64工具的使用方法
  • Java大师成长计划之第23天:Spring生态与微服务架构之服务发现与注册中心
  • 使用命令行拉取 Git 仓库
  • 数学复习笔记 9
  • 自学嵌入式 day 18 - 数据结构 1
  • 嵌软面试每日一阅----FreeRTOS
  • SpringBoot实现简单的API代理服务器
  • Sumsub 活体检测与人证对比 Java Demo
  • pytorch训练可视化工具---TensorBoard
  • Linux 防火墙 firewalld 实战配置教程!
  • 将.pt文件执行图像比对
  • Java详解RabbitMQ工作模式之发布订阅模式