以下是在 Python 环境中实现的一个兼顾准确性与实用性的邮箱正则表达式,能够从文本中提取符合大多数常见格式的邮箱地址。

正则表达式(推荐版)

r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b'
  • 本地部分[A-Za-z0-9._%+-]+ 允许字母、数字、点、下划线、百分号、加号、减号。
  • 域名部分[A-Za-z0-9.-]+\.[A-Za-z]{2,} 要求至少一个点且顶级域至少 2 个字母。
  • 单词边界\b 确保不会匹配到邮件地址前后多余的字符(如 URL 中的片段)。

该正则可以覆盖绝大多数真实场景(如 user.name+tag@sub.domain.co.uk),但严格遵循 RFC 5322 非常复杂(长度、注释、IP 地址等),本实现是工程上的最佳平衡。

完整代码示例

import re

def extract_emails(text: str) -> list:
    """从字符串中提取所有邮箱地址"""
    pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b'
    return re.findall(pattern, text)

# ---------- 三个典型案例 ----------
if __name__ == "__main__":
    test_cases = [
        # 案例1:普通邮箱,包含点号、下划线、数字
        "我的邮箱是 john.doe_123@example.com,请发送资料。",
        
        # 案例2:带加号(常用于别名)、多级子域名
        "支持邮箱:user+filter@mail.sub.domain.co.uk 可以联系。",
        
        # 案例3:混合文本中多个邮箱,含大写字母、短横线
        "请抄送 ADMIN@MY-COMPANY.ORG 和 support-team@test.org.cn。"
    ]
    
    for i, text in enumerate(test_cases, 1):
        emails = extract_emails(text)
        print(f"案例{i}: {text}")
        print(f"提取结果: {emails}\n")

输出结果

案例1: 我的邮箱是 john.doe_123@example.com,请发送资料。
提取结果: ['john.doe_123@example.com']

案例2: 支持邮箱:user+filter@mail.sub.domain.co.uk 可以联系。
提取结果: ['user+filter@mail.sub.domain.co.uk']

案例3: 请抄送 ADMIN@MY-COMPANY.ORG 和 support-team@test.org.cn。
提取结果: ['ADMIN@MY-COMPANY.ORG', 'support-team@test.org.cn']

如果追求更严格的校验(RFC 5322 近似版)

若需要尽可能覆盖规范允许的字符(如 !#$%&'*+-/=?^_{|}~` 等),可以使用更长的正则:

r'\b[a-zA-Z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&\'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\b'

不过该正则对于日常文本提取过于复杂且容易误匹配,一般不推荐。建议优先使用前面的实用版本。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐