如何用Python正则从线程化邮件正文中精准提取独立签名段?
提取线程化邮件中的独立签名段解决方案
问题分析
线程化邮件的签名段通常位于With Regards/Best Regards等问候语之后,下一封邮件的From:/Von:行之前。之前的正则问题大概率是没用到非贪婪匹配和行锚定,导致过度匹配了无关内容。
解决方案
使用结合多行模式、DOTALL模式的正则表达式,通过正向预查精准定位签名的结束边界,避免多余内容被包含。
正则表达式
(With Regards|Best Regards|Kind Regards)(.*?)(?=^From:|^Von:|\Z)
(With Regards|Best Regards|Kind Regards):匹配签名的起始问候语,可根据需求扩展更多问候词(比如德语的Mit freundlichen Grüßen)(.*?):非贪婪匹配问候语之后的所有内容,防止匹配到下一封邮件的内容(?=^From:|^Von:|\Z):正向预查,匹配到下一封邮件的行首From:/Von:,或者文本结尾,作为签名的结束边界(不会把From:/Von:本身包含进去)
Python 代码实现
import re # 替换为pywin32提取的线程化邮件正文 email_body = """Hi there, This is the email content. Best Regards, John Doe Senior Developer From: Jane Smith <jane@example.com> Subject: Re: Threaded Email With Regards, Jane Smith""" # 编译正则,开启多行模式和DOTALL模式 sig_pattern = re.compile( r'(With Regards|Best Regards|Kind Regards)(.*?)(?=^From:|^Von:|\Z)', re.MULTILINE | re.DOTALL ) # 提取所有签名并清理格式 raw_signatures = sig_pattern.findall(email_body) clean_signatures = [ (greeting + content).strip() for greeting, content in raw_signatures ] # 输出结果 for i, sig in enumerate(clean_signatures, 1): print(f"签名 {i}:\n{sig}\n")
代码说明
re.MULTILINE:让^匹配每行的开头,确保From:/Von:只匹配新邮件的行首标识re.DOTALL:让.匹配换行符,确保签名段内的换行内容被完整匹配strip():去除签名前后的多余空白和换行,让结果更整洁
扩展优化
- 若需要支持更多语言的问候语,直接在正则的问候语分组里添加即可,比如:
(With Regards|Best Regards|Mit freundlichen Grüßen) - 如果签名中可能包含
From:(比如签名里的联系方式),可以给From:/Von:添加更严格的匹配规则,比如匹配行首后紧跟空格和邮箱格式:(?=^From: .*@|^Von: .*@|\Z)
内容的提问来源于stack exchange,提问作者Pravin
相关产品推荐
相关产品推荐

