定义一个函数来解析电子邮件地址

时间:2019-02-09 15:59:03

标签: python regex

我需要编写一个函数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

4 个答案:

答案 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