Python教学:采用正则表达式提取邮箱-由Deepseek产生
·
以下是在 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'
不过该正则对于日常文本提取过于复杂且容易误匹配,一般不推荐。建议优先使用前面的实用版本。
更多推荐


所有评论(0)