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

正则表达式如何匹配含空格分隔词汇的邮件签名落款

问题根因

你当前的实现有两个直接导致匹配失败的问题:

  • 正则里硬编码只引用了language_keyword_footer的第0、第1个索引元素,数组中第三个关键词Thanks & Regards,根本没有进入匹配逻辑
  • 多关键词并列匹配时没有做长度优先级处理,短关键词会优先命中截断长词:比如如果Thanks,的匹配顺序在Thanks & Regards,前面,遇到长落款时会在Thanks,位置就终止匹配,拿不到完整结果。

正则本身原生支持匹配带空格、&这类特殊字符的文本,不需要为空格单独写特殊匹配规则。

修复方案

1. 调整关键词生成逻辑

不要硬编码数组索引,把所有footer关键词按「字符串长度从长到短」排序后,动态拼接成正则的或匹配组,从根源解决漏匹配、短词抢匹配的问题。
参考Python实现:

import re

keywords = {
    "en": {"header": ["From:", "Subject:"], "footer": ["Regards,", "Thanks,", "Thanks & Regards,"]}
}
# 落款关键词按长度倒序,保证长词优先匹配
sorted_footers = sorted(keywords["en"]["footer"], key=lambda x: len(x), reverse=True)
footer_match_part = "|".join(map(re.escape, sorted_footers))
# 完整正则:匹配落款关键词 + 后续签名内容,到空行/文本末尾停止
signature_re = re.compile(
    rf"({footer_match_part})(.*?)(?=\n\s*\n|$)",
    re.DOTALL | re.IGNORECASE
)

这里加re.escape是为了转义关键词里可能出现的正则特殊字符(比如未来加关键词带.、*之类的不会报错),加re.IGNORECASE可以兼容大小写变体比如thanks & regards,。

2. 匹配逻辑说明

  • 终止边界用(?=\n\s*\n|$)比原来的(\S+(.*?))更稳定:邮件正文和落款之间通常会留空行,匹配到下一个空行(允许空行里有多余空格/制表符)或者文本末尾就停止,不会误吞正文内容。
  • 后续扩展多语言、更多落款关键词时,只需要往对应语言的footer数组里加值即可,不需要修改正则主体逻辑。
效果验证

用测试文本验证:

test_mail = """
Hi all,
Please review the updated document before EOD.

Thanks & Regards,
Zhang San
Product Manager
"""

result = signature_re.search(test_mail)
print(result.group(0).strip())

输出结果可以完整捕获目标落款和后续签名:

Thanks & Regards,
Zhang San
Product Manager

原有Thanks,、Regards两类场景的匹配也不会受影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:24:22