You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

代码说明

  1. 多场景正则匹配:针对邮件中销量、库存的不同表述方式,编写了多组正则规则,确保覆盖所有样本中的格式。
  2. 数字标准化处理:自动去除数字中的千位分隔符,转换为整数类型,便于后续计算或存储。
  3. 结构化输出:将每个邮件的提取结果整理为字典,最终合并成DataFrame,方便进行数据筛选、导出等操作。

扩展建议

  • 若后续出现新的邮件格式,只需在sales_patterns或inventory_patterns中添加对应的正则规则即可。
  • 若需处理HTML格式的邮件,可替换message.body为message.HTMLBody,并调整正则规则适配HTML标签结构。

内容的提问来源于stack exchange,提问作者San

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:05:07