首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义一个解析电子邮件入口的函数

定义一个解析电子邮件入口的函数
EN

Stack Overflow用户
提问于 2019-02-09 15:59:02
回答 4查看 1.7K关注 0票数 0

我需要编写一个函数parse_email,该函数给定电子邮件地址s,返回与用户名和域名相对应的元组(用户id、域)。例如,给定richie@cc.gatech.edu,它应该返回(里奇,cc.gatech.edu)。

该函数应该解析电子邮件,只有当它完全符合电子邮件规范。例如,如果有前导或尾随空格,则函数不应与这些空格匹配。此外,函数的开头应该是字母,也应该是结尾。如果它不是一个字母表,它应该得到一个错误,如果字符串包含任何空格。

我尝试了以下功能:

代码语言:javascript
复制
def parse_email (s):
    """Parses a string as an email address, returning an (id, domain) pair."""
    try:
        return(re.match(r'\S([\w\.+_-]+)@([\w\._-]+)',s).groups())
    except:
        pass

有人能帮我完成这个函数吗?如果字符串的开头有空格,就会出现错误。

代码语言:javascript
复制
def parse_email (s):   
    try:    
            return(re.match(r'\S([\w\.+_-]+)@([\w\._-]+)',s).groups())    
    except:    
        pass
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-02-09 16:38:54

我建议您在裁剪任何空格后,只在@上拆分输入字符串。正如注释中提到的,您可能会在电子邮件地址中遇到多个@符号,因此在正确的地址上拆分是非常重要的。

为“有效”电子邮件地址构建正则表达式是一场噩梦,你肯定会弄错的。本文解释了为什么:

https://hackernoon.com/the-100-correct-way-to-validate-email-addresses-7c4818f24643

下面是一些带有测试的代码,这些代码显示了这是如何工作的,但是它不能处理多个@符号。

代码语言:javascript
复制
import pytest

def parse_email(s):
  parts = s.strip().split('@', 1)
  if len(parts) == 2:
    return (parts[0], parts[1])
  else:
    raise ValueError()

def test_parse_simple_email():
  parts = parse_email("cheese@peas.com")
  assert len(parts) == 2
  assert parts[0] == "cheese"
  assert parts[1] == "peas.com"

def test_invalid_email():
  with pytest.raises(ValueError):
    parts = parse_email("this is not an e-mail address")

def test_parse_email_with_whitespace():
  parts = parse_email(" cheese@peas.com ")
  assert len(parts) == 2
  assert parts[0] == "cheese"
  assert parts[1] == "peas.com"
票数 0
EN

Stack Overflow用户

发布于 2019-02-09 17:02:14

正则表达式在这里是完全错误的工具。Python 3.6+有一个库函数,它正是这样做的。

代码语言:javascript
复制
from email.policy import default as email_default_policy
from email import message_from_string

msg = message_from_string('To: {}'.format(s), policy=email_default_policy)
for addr in msg['to'].addresses:
    yield addr.username, addr.domain

email.headerregistry库提供了解析的电子邮件地址的结构化表示。email.policy.default对象是启用3.6+ email解析功能所必需的(尽管文档声称它最终将成为默认策略,此时您应该不再需要显式地指定它)。

在纯正则表达式中有RFC822头解析器的演示。规范的一页大概是一整页的文本:邮件::RFC822 822::Address Regex

票数 1
EN

Stack Overflow用户

发布于 2019-02-09 16:29:21

拆分可用于:

代码语言:javascript
复制
def parse_email (s):   
    try:
        x=re.split('@',s)
        return (x[0],x[1])   
    except:    
        pass

快乐编码:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54607954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档