基于正则表达式规则拆分大文件为指定邮件块的方法求助
解决方案
使用带有正向预查的正则表达式结合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:|$):正向预查定义块的结束条件:\n\s*Subject:.*?\n\s*From::匹配下一个Subject:标记,且该标记之后(允许任意空白和内容)出现From:,代表新邮件块的开始$:匹配文件结尾,处理最后一个邮件块
为什么之前的方法失效?
- 第一种
split方法:re.split(r'\n(?=Subject:)', email_data)会把所有Subject:都当作分隔点,不管后面是否有From:,导致把属于同一个块的Subject: How are you.错误分割成单独块。 - 第二种
findall方法:re.findall(r'Subject:.*?(?=Subject:|\nFrom:|$)', email_data, re.DOTALL)错误地把From:当作块的结束标记,而From:是邮件块内的合法内容,导致匹配提前终止,只能获取部分内容。
测试结果
用你提供的示例数据测试,会得到3个符合规则的块:
- 第一个块包含
Subject: Hello到Subject: How are you.的全部内容 - 第二个块包含
Subject: Howdy到Lorem ipsum...的内容 - 第三个块包含
Subject: Re: Howdy到From: Eminem的内容
内容的提问来源于stack exchange,提问作者misaligar
相关产品推荐
相关产品推荐

