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

基于正则表达式规则拆分大文件为指定邮件块的方法求助

解决方案

使用带有正向预查的正则表达式结合re.findall,可以精准匹配符合规则的邮件块:

import re

# 读取大文件内容
with open("your_email_file.txt", "r") as f:
    email_data = f.read()

# 匹配符合规则的邮件块
email_blocks = re.findall(
    r'Subject:.*?(?=\n\s*Subject:.*?\n\s*From:|$)',
    email_data,
    re.DOTALL
)

# 可选:清理每个块末尾的多余换行
email_blocks = [block.rstrip('\n') for block in email_blocks]

正则表达式解释

  • Subject::匹配每个邮件块的起始标记
  • .*?:非贪婪模式匹配任意字符(包括换行,因为启用了re.DOTALL),避免过度匹配后续内容
  • (?=\n\s*Subject:.*?\n\s*From:|$):正向预查定义块的结束条件:
    1. \n\s*Subject:.*?\n\s*From::匹配下一个Subject:标记,且该标记之后(允许任意空白和内容)出现From:,代表新邮件块的开始
    2. $:匹配文件结尾,处理最后一个邮件块

为什么之前的方法失效?

  1. 第一种split方法:re.split(r'\n(?=Subject:)', email_data)会把所有Subject:都当作分隔点,不管后面是否有From:,导致把属于同一个块的Subject: How are you.错误分割成单独块。
  2. 第二种findall方法:re.findall(r'Subject:.*?(?=Subject:|\nFrom:|$)', email_data, re.DOTALL)错误地把From:当作块的结束标记,而From:是邮件块内的合法内容,导致匹配提前终止,只能获取部分内容。

测试结果

用你提供的示例数据测试,会得到3个符合规则的块:

  1. 第一个块包含Subject: Hello到Subject: How are you.的全部内容
  2. 第二个块包含Subject: Howdy到Lorem ipsum...的内容
  3. 第三个块包含Subject: Re: Howdy到From: Eminem的内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:55:15