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

无分隔符邮箱地址提取的正则表达式解决方案求助

嘿,我来帮你解决这个无分隔符文本里提取邮箱的问题!你的正则表达式失效主要有几个原因:本地部分没包含下划线(示例里有my.name_test这种带下划线的邮箱)、域名后缀的分组写法有问题,而且没处理邮箱之间的衔接导致过度匹配。下面一步步来搞定:

先修复你的正则表达式

针对你的示例场景,我调整后的正则是:

[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+(?:\.(?:com|at|de|or\.at))(?![a-zA-Z0-9._-])

关键改进点:

  • 本地部分新增了_:[a-zA-Z0-9._-]+,能匹配像my.name_test这种带下划线的邮箱前缀
  • 域名后缀用非捕获分组包裹,并且给or.at里的.加了转义(or\.at),避免和前面的通配.混淆
  • 末尾加了(?![a-zA-Z0-9._-])正向否定预查,确保匹配到的邮箱结尾后面不是合法的邮箱字符(比如下一个邮箱的开头字母),防止把hotmail.comwelcome这种连在一起的内容误判成域名

用这个正则匹配你的示例字符串,能精准提取出5个正确的邮箱:
email1@hotmail.com、welcome@mydomain.at、info@another-domain.de、testing@domain.or.at、my.name_test@domainname.de

更优的域名判定方法

硬编码域名后缀(com|at|de|or.at)的局限性很大,比如遇到新的后缀或者像co.uk、gov.cn这类多级后缀就会失效。更专业的做法是**结合公共后缀列表(PSL)**来验证域名合法性:

公共后缀列表是Mozilla维护的权威列表,包含所有合法的顶级域名(TLD)和二级公共后缀(比如or.at、co.uk)。我们可以用它来判断邮箱的域名部分是否是有效的公共后缀+注册域名组合,避免硬编码的麻烦。

具体实现思路:

  1. 用正则提取所有候选邮箱
  2. 对每个候选邮箱的域名部分,用PSL验证是否为合法域名
  3. 过滤掉域名无效的候选
完整代码示例(Python)
import re
from publicsuffix2 import get_sld

# 你的示例无分隔符文本
raw_text = "email1@hotmail.comwelcome@mydomain.atinfo@another-domain.detesting@domain.or.atmy.name_test@domainname.de"

# 第一步:用改进后的正则提取候选邮箱
email_regex = re.compile(r'[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+(?:\.(?:com|at|de|or\.at))(?![a-zA-Z0-9._-])')
candidate_emails = email_regex.findall(raw_text)

# 第二步:用PSL验证域名合法性,筛选有效邮箱
valid_emails = []
for email in candidate_emails:
    _, domain = email.split('@')
    try:
        # 能成功提取二级域名,说明域名合法
        get_sld(domain)
        valid_emails.append(email)
    except ValueError:
        # 无法提取,说明域名无效,跳过
        continue

print("提取到的有效邮箱:")
for email in valid_emails:
    print(f"- {email}")

运行这段代码后,输出的结果就是所有正确的邮箱啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:58:16