我需要编写一个函数parse_email,该函数给定电子邮件地址s,返回与用户名和域名相对应的元组(用户id、域)。例如,给定richie@cc.gatech.edu,它应该返回(里奇,cc.gatech.edu)。
该函数应该解析电子邮件,只有当它完全符合电子邮件规范。例如,如果有前导或尾随空格,则函数不应与这些空格匹配。此外,函数的开头应该是字母,也应该是结尾。如果它不是一个字母表,它应该得到一个错误,如果字符串包含任何空格。
我尝试了以下功能:
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有人能帮我完成这个函数吗?如果字符串的开头有空格,就会出现错误。
def parse_email (s):
try:
return(re.match(r'\S([\w\.+_-]+)@([\w\._-]+)',s).groups())
except:
pass发布于 2019-02-09 16:38:54
我建议您在裁剪任何空格后,只在@上拆分输入字符串。正如注释中提到的,您可能会在电子邮件地址中遇到多个@符号,因此在正确的地址上拆分是非常重要的。
为“有效”电子邮件地址构建正则表达式是一场噩梦,你肯定会弄错的。本文解释了为什么:
https://hackernoon.com/the-100-correct-way-to-validate-email-addresses-7c4818f24643
下面是一些带有测试的代码,这些代码显示了这是如何工作的,但是它不能处理多个@符号。
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"发布于 2019-02-09 17:02:14
正则表达式在这里是完全错误的工具。Python 3.6+有一个库函数,它正是这样做的。
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.domainemail.headerregistry库提供了解析的电子邮件地址的结构化表示。email.policy.default对象是启用3.6+ email解析功能所必需的(尽管文档声称它最终将成为默认策略,此时您应该不再需要显式地指定它)。
在纯正则表达式中有RFC822头解析器的演示。规范的一页大概是一整页的文本:邮件::RFC822 822::Address Regex
发布于 2019-02-09 16:29:21
拆分可用于:
def parse_email (s):
try:
x=re.split('@',s)
return (x[0],x[1])
except:
pass快乐编码:)
https://stackoverflow.com/questions/54607954
复制相似问题