我需要编写一个函数parse_email,给定一个电子邮件地址s,该函数返回一个与用户名和域名相对应的元组((用户ID,域))。 例如,给定richie@cc.gatech.edu,它应该返回(richie,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
答案 0 :(得分:1)
在这里,正则表达式完全是错误的工具。 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.domain
email.headerregistry
库提供了已解析电子邮件地址的结构化表示。 email.policy.default
对象是启用3.6+ email
解析功能所必需的(尽管documentation声称它最终将成为默认策略,这时您不再需要指定它明确地)。
在纯正则表达式中有RFC822标头解析器的演示。规范的内容大约是整页文字:Mail::RFC822::Address Regex
答案 1 :(得分:0)
可以使用拆分:
def parse_email (s):
try:
x=re.split('@',s)
return (x[0],x[1])
except:
pass
快乐编码:)
答案 2 :(得分:0)
我建议您在修剪任何空格后,简单地在@
上分割输入字符串。正如评论中提到的,您在电子邮件地址中可能会遇到多个@
符号,因此,请分隔正确的符号。
为“有效的”电子邮件地址构建正则表达式是一场噩梦,您一定会弄错它。本文介绍了原因:
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"
答案 3 :(得分:-2)
我认为以下codE和功能应该可以完成工作:
def parse_email(s):
试试:
z = re.fullmatch(r'\ b([a-zA-Z])([\ w。+ -] +)@([\ w。-] +)([a- zA-Z])\ b',s).groups()
return(z [0] + z [1],z [2] + z [3])
除了AttributeError:
引发ValueError