如何用Python区分并提取邮件中的销量与库存数据?
问题描述
我是Python新手,以下是我收到的几份邮件样本:
邮件样本1
亲爱的各位:
请注意总销量和剩余库存情况
总销量:45677
剩余库存A:3456
如有疑问或意见,欢迎随时联系。
此致,
邮件样本2
亲爱的各位:
请查看以下数据:
总销量:1,231,245
剩余库存A数量:232
剩余库存B数量:1,435
邮件样本3
亲爱的各位:
我们的销量为233,435
剩余库存A总量:2453
邮件样本4
五月份我们有90件剩余库存A和4190 TEUs。
我希望通过Python提取这些邮件中的销量和剩余库存数据,但不知如何实现。我已编写了如下代码可提取邮件中的数字,但无法区分这些数字对应的是总销量还是剩余库存,恳请提供技术指引:
import re import pandas as pd import win32com.client from datetime import datetime, timedelta outlook = win32com.client.Dispatch('outlook.application') mapi = outlook.GetNamespace("MAPI") inbox = mapi.GetDefaultFolder(6).Folders.Item("AI email testing") #outlook.GetDefaultFolder(6) .Folders.Item("Your_Folder_Name") #inbox = outlook.GetDefaultFolder(6) messages = inbox.Items received_dt = datetime.now() - timedelta(days=1) received_dt = received_dt.strftime('%m/%d/%Y %H:%M %p') for message in list(messages): #print (message) body_content = message.body body_content =body_content[body_content.find("Subject:"):] #print(body_content) figures = re.findall("\d+(?:,\d+)*(?:\.\d+)?",body_content) print(figures)
解决方案
核心思路是通过正则匹配包含关键词的完整语句,而非单独提取数字,以此建立数字与对应类别的关联。具体实现如下:
改进后的代码
import re import pandas as pd import win32com.client from datetime import datetime, timedelta def extract_data(email_body): # 定义销量相关的正则匹配规则,覆盖不同表述 sales_patterns = [ r'总销量:(\d+(?:,\d+)*)', r'销量为(\d+(?:,\d+)*)' ] # 定义库存相关的正则匹配规则,覆盖不同表述 inventory_patterns = [ r'剩余库存(\w+):(\d+(?:,\d+)*)', r'剩余库存(\w+)数量:(\d+(?:,\d+)*)', r'剩余库存(\w+)总量:(\d+(?:,\d+)*)', r'(\d+)件剩余库存(\w+)' ] result = {'总销量': None} inventory = {} # 提取销量数据 for pattern in sales_patterns: match = re.search(pattern, email_body) if match: # 去除数字中的逗号并转换为整数 sales_num = int(match.group(1).replace(',', '')) result['总销量'] = sales_num break # 提取库存数据 for pattern in inventory_patterns: matches = re.findall(pattern, email_body) for match in matches: item = match[0] if len(match) == 2 else match[1] num = int(match[1].replace(',', '')) if len(match) == 2 else int(match[0].replace(',', '')) inventory[f'剩余库存{item}'] = num result.update(inventory) return result # Outlook邮件读取逻辑保持不变 outlook = win32com.client.Dispatch('outlook.application') mapi = outlook.GetNamespace("MAPI") inbox = mapi.GetDefaultFolder(6).Folders.Item("AI email testing") messages = inbox.Items received_dt = datetime.now() - timedelta(days=1) received_dt = received_dt.strftime('%m/%d/%Y %H:%M %p') # 遍历邮件并提取结构化数据 all_email_data = [] for message in list(messages): body_content = message.body body_content = body_content[body_content.find("Subject:"):] extracted = extract_data(body_content) # 补充邮件元数据(可选) extracted['邮件主题'] = message.Subject extracted['接收时间'] = message.ReceivedTime all_email_data.append(extracted) # 转换为DataFrame方便后续分析 df = pd.DataFrame(all_email_data) print(df)
代码说明
- 多场景正则匹配:针对邮件中销量、库存的不同表述方式,编写了多组正则规则,确保覆盖所有样本中的格式。
- 数字标准化处理:自动去除数字中的千位分隔符,转换为整数类型,便于后续计算或存储。
- 结构化输出:将每个邮件的提取结果整理为字典,最终合并成DataFrame,方便进行数据筛选、导出等操作。
扩展建议
- 若后续出现新的邮件格式,只需在
sales_patterns或inventory_patterns中添加对应的正则规则即可。 - 若需处理HTML格式的邮件,可替换
message.body为message.HTMLBody,并调整正则规则适配HTML标签结构。
内容的提问来源于stack exchange,提问作者San
相关产品推荐
相关产品推荐

