是否有一个好方法来检查表单输入使用正则表达式,以确保它是一个正确的风格的电子邮件地址?从昨晚开始搜索,每个人都回答了关于这个话题的问题,如果它是一个子域名的电子邮件地址,似乎也有问题。


当前回答

我在这里看到了很多复杂的答案。他们中的一些人,不知道简单,真实的电子邮件地址,或有假阳性。下面是测试字符串是否为有效电子邮件的最简单方法。它测试2和3个字母的TLD。现在技术上你可以有更大的,你可能希望增加3到4,5甚至10。

import re
def valid_email(email):
  return bool(re.search(r"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$", email))

其他回答

from validate_email import validate_email
is_valid = validate_email('example@example.com',verify=True)
print(bool(is_valid))

参见validate_email文档。

检查电子邮件使用email_validator

from email_validator import validate_email, EmailNotValidError

def check_email(email):
    try:
        v = validate_email(email)  # validate and get info
        email = v["email"]  # replace with normalized form
        print("True")
    except EmailNotValidError as e:
        # email is not valid, exception message is human-readable
        print(str(e))

check_email("test@gmailcom")

Python标准库附带了一个电子邮件解析函数:email.utils.parseaddr()。

它返回一个包含电子邮件的真实姓名和实际地址部分的二元组:

>>> from email.utils import parseaddr
>>> parseaddr('foo@example.com')
('', 'foo@example.com')

>>> parseaddr('Full Name <full@example.com>')
('Full Name', 'full@example.com')

>>> parseaddr('"Full Name with quotes and <weird@chars.com>" <weird@example.com>')
('Full Name with quotes and <weird@chars.com>', 'weird@example.com')

如果解析不成功,它返回一个空字符串的二元组:

>>> parseaddr('[invalid!email]')
('', '')

这个解析器的一个问题是,它接受任何被认为是RFC-822和朋友的有效电子邮件地址的东西,包括许多在广泛的互联网上显然无法寻址的东西:

>>> parseaddr('invalid@example,com') # notice the comma
('', 'invalid@example')

>>> parseaddr('invalid-email')
('', 'invalid-email')

因此,正如@TokenMacGuy所说,检查电子邮件地址的唯一确定方法是向预期的地址发送电子邮件,并等待用户对消息中的信息采取行动。

然而,你可能想要检查,至少,在第二个元组元素上是否存在@-符号,就像@bvukelic建议的那样:

>>> '@' in parseaddr("invalid-email")[1]
False

如果你想更进一步,你可以安装dnspython项目并解析电子邮件域的邮件服务器(“@”后面的部分),只有当有实际的MX服务器时才尝试发送电子邮件:

>>> from dns.resolver import query
>>> domain = 'foo@bar@google.com'.rsplit('@', 1)[-1]
>>> bool(query(domain, 'MX'))
True
>>> query('example.com', 'MX')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  [...]
dns.resolver.NoAnswer
>>> query('not-a-domain', 'MX')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  [...]
dns.resolver.NXDOMAIN

你可以通过捕获dns.exception.DNSException来捕获NoAnswer和NXDOMAIN。

是的,foo@bar@google.com是一个语法有效的地址。应该只考虑最后一个@来检测域部分从哪里开始。

import re
def email():
    email = raw_input("enter the mail address::")
     match = re.search(r'[\w.-]+@[\w.-]+.\w+', email)

    if match:
        print "valid email :::", match.group()
    else:
        print "not valid:::"

email()

我发现了一个很好的(经过测试的)方法来检查有效的电子邮件地址。我把代码粘贴在这里:

# here i import the module that implements regular expressions
import re

# here is my function to check for valid email address
def test_email(your_pattern):
  pattern = re.compile(your_pattern)
  # here is an example list of email to check it at the end
  emails = ["john@example.com", "python-list@python.org", "wha.t.`1an?ug{}ly@email.com"]
  for email in emails:
    if not re.match(pattern, email):
        print "You failed to match %s" % (email)
    elif not your_pattern:
        print "Forgot to enter a pattern!"
    else:
        print "Pass"

# my pattern that is passed as argument in my function is here!
pattern = r"\"?([-a-zA-Z0-9.`?{}]+@\w+\.\w+)\"?"   

# here i test my function passing my pattern
test_email(pattern)