Python正则re.Match对象调用split报AttributeError解决方法
报错成因
- 核心错误是对非字符串类型的对象调用了仅字符串支持的
split()方法:re.finditer()返回的是正则匹配结果的可迭代对象,遍历得到的每个元素是re.Match类型的匹配结果对象,本身不具备字符串的split方法。 - 代码存在变量书写错误:循环内误将存储所有匹配结果的迭代器
matches当成了匹配到的文本内容调用方法,就算修改为match.split()依然会触发相同的属性错误。 - 原有正则存在兼容缺陷:只能匹配编号和日期直接相邻的基础邮件格式,无法适配中间夹带
Line xx Seq x扩展信息的新格式邮件。
修复方案
- 调整正则表达式,使用捕获分组直接提取目标字段,跳过中间无关内容,同时兼容两类邮件格式:
正则规则为r'([a-zA-Z]+[0-9]+).*?([0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4})'- 第一个分组
([a-zA-Z]+[0-9]+):匹配字母开头+数字组成的标识编号 - 中间段
.*?:非贪婪匹配编号和日期之间的任意内容,既兼容无额外内容的基础格式,也能适配夹了扩展信息的新格式 - 第二个分组
([0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4}):匹配月/日/年格式的日期
- 第一个分组
- 调用
match.group(序号)方法获取分组捕获到的字符串内容,不要直接对Match对象使用字符串方法。 - 按要求拼接为
编号, 日期的格式,最终写入CSV文件即可。
修复后完整代码
import re import csv # 替换为实际传入的邮件正文参数 # body = 你的邮件正文内容 # 开启多行匹配模式,兼容两类邮件格式 pattern = re.compile(r'([a-zA-Z]+[0-9]+).*?([0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4})', re.MULTILINE) result = [] for match in pattern.finditer(body): # 提取两个捕获分组的内容 track_id = match.group(1) date_str = match.group(2) result.append([track_id, date_str]) # 导出为CSV文件 with open('mail_record.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) # 需要表头可放开下一行注释 # writer.writerow(['标识编号', '对应日期']) writer.writerows(result)
输出效果
两类邮件内容扫描后,都会输出符合预期的格式:
PUU128377, 5/22/2023 PUN102938, 11/1/2024 PUU012938, 10/01/2025
内容的提问来源于stack exchange,提问作者LaunchCoder33
相关产品推荐
相关产品推荐

