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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:15:41