正则表达式 - Python检查有效的电子邮件地址?

是否有一种很好的方法来检查表单输入使用正则表达式,以确保它是一个正确的样式电子邮件地址? 从昨晚开始搜索,如果这是一个子网站的电子邮件地址,那么回答人们关于这个主题的问题的每个人似乎都有问题。

Bobby asked 2019-05-24T11:21:26Z
18个解决方案
210 votes

无关紧要。 即使您可以验证电子邮件地址在语法上是否有效,您仍然需要检查它是否输入错误,并且它实际上是发送给您认为它的人。 唯一的方法是向他们发送电子邮件,让他们点击链接进行验证。

因此,最基本的检查(例如,他们没有意外地输入他们的街道地址)通常就足够了。 类似的东西:它只有一个validate_email标志,并且在@之后的部分中至少有一个.

[^@]+@[^@]+\.[^@]+

您可能也想要禁止空格 - 可能有效的电子邮件地址中包含空格,但我从未见过它,因此这是用户错误的可能性就在您身边。

如果您想要全面检查,请查看此问题。


更新:以下是如何使用任何此类正则表达式:

import re

if not re.match(r"... regex here ...", email):
  # whatever

注意字符串前面的validate_email; 这样,你就不需要两次逃避。

如果要检查大量的正则表达式,首先编译正则表达式可能会更快:

import re

EMAIL_REGEX = re.compile(r"... regex here ...")

if not EMAIL_REGEX.match(email):
  # whatever

另一种选择是使用validate_email软件包,该软件包实际上与SMTP服务器联系以验证该地址是否存在。 但这并不能保证它属于合适的人选。

Thomas answered 2019-05-24T11:22:27Z
97 votes

Python标准库附带一个电子邮件解析功能:NoAnswer

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

>>> 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所说,检查电子邮件地址的唯一确定方法是将电子邮件发送到预期地址,并等待用户对邮件内的信息进行操作。

但是,您可能想要检查,至少在第二个元组元素上是否存在@ -sign,正如@bvukelic建议的那样:

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

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

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

您可以捕获NoAnswerNXDOMAIN来捕获foo@bar@google.com

是的,foo@bar@google.com是一个语法上有效的地址。 只应考虑最后一个@来检测域部分的起始位置。

LeoRochael answered 2019-05-24T11:23:48Z
44 votes

我还没有在自定义正则表达式的答案中找到答案,但......

Python有一个名为validate_email的模块,它有3个级别的电子邮件验证,包括询问有效的SMTP服务器,如果电子邮件地址有效(不发送电子邮件)。

检查邮件字符串是否有效格式:

from validate_email import validate_email
is_valid = validate_email('example@example.com')

检查主机是否具有SMTP服务器:

is_valid = validate_email('example@example.com',check_mx=True)

检查主机是否有SMTP服务器并且电子邮件确实存在:

is_valid = validate_email('example@example.com',verify=True)

对于那些对脏细节感兴趣的人,validate_email.py(source)旨在忠实于RFC 2822。

我们所做的只是将输入字符串与一个字符串进行比较   巨大的正则表达。 但建立正则表达式,和   确保其正确性,通过组装使其变得更加容易   来自RFC定义的“令牌”。 这些令牌中的每一个都是   在附带的单元测试文件中测试。


用pip安装

pip install validate_email

你需要pyDNS模块来检查SMTP服务器

pip install pyDNS

或者来自Ubuntu

apt-get python3-dns
philshem answered 2019-05-24T11:25:16Z
22 votes

电子邮件地址并不像看起来那么简单! 例如,Bob_O'Reilly+tag@example.com是有效的电子邮件地址。

我对lepl软件包运气不错([http://www.acooke.org/lepl/)。]它可以验证RFC 3696中所示的电子邮件地址:[http://www.faqs.org/rfcs/rfc3696.html]

找到一些旧代码:

import lepl.apps.rfc3696
email_validator = lepl.apps.rfc3696.Email()
if not email_validator("email@example.com"):
    print "Invalid email"
bigendian answered 2019-05-24T11:25:55Z
7 votes

我发现了一种检查有效电子邮件地址的优秀(且经过测试)方法。 我在这里粘贴代码:

# 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)
James The Beard answered 2019-05-24T11:26:21Z
6 votes

我在这看到很多复杂的答案。 他们中的一些人,不了解简单,真实的电子邮件地址,或有误报。 下面是测试字符串是否是有效电子邮件的最简单方法。 它测试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))
PyTis answered 2019-05-24T11:26:48Z
4 votes

这通常使用正则表达式来解决。 然而,解决方案有许多变化。 取决于您需要的严格程度,以及是否有自定义验证要求,或者是否接受任何有效的电子邮件地址。

请参阅此页面以供参考:[http://www.regular-expressions.info/email.html]

Mithon answered 2019-05-24T11:27:21Z
3 votes

电子邮件地址非常复杂。 这是一个匹配每个RFC822有效地址的示例正则表达式:[http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html]

您会注意到它可能比您的其他程序更长。 Perl甚至还有整个模块,用于验证电子邮件地址。 所以你可能不会得到任何100%完美的正则表达式,同时也是可读的。 这是一个递归下降解析器的示例:[http://cpansearch.perl.org/src/ABIGAIL/RFC-RFC822-Address-2009110702/lib/RFC/RFC822/Address.pm]

但是你需要决定是否需要完美的解析或简单的代码。

Dan answered 2019-05-24T11:28:01Z
1 votes
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()
nidhin answered 2019-05-24T11:28:20Z
1 votes

如果你想从长字符串或文件中取出邮件然后试试这个。

([^@|\s]+@[^@]+\.[^@|\s]+)

请注意,当您在电子邮件地址之前和之后有空格时,这将有效。 如果你没有空间或有一些特殊的字符,那么你可以尝试修改它。

工作范例:

string="Hello ABCD, here is my mail id example@me.com "
res = re.search("([^@|\s]+@[^@]+\.[^@|\s]+)",string,re.I)
res.group(1)

这将从此字符串中取出example@me.com。

此外,请注意这可能不是正确的答案..但我已经在这里发布它,以帮助像我这样有特定要求的人

Raj Chinna answered 2019-05-24T11:29:09Z
1 votes

上面提到的parseaddr会忽略尾随的@。

from email.utils import parseaddr
parseaddr('aaa@bbb@ccc.com') ('', 'aaa@bbb')

可能提取地址并与原始地址进行比较?

有人试过validate.email吗?

Serge answered 2019-05-24T11:29:48Z
1 votes
import validator
is_valid = validate_email('example@example.com',verify=True)
if (is_valid==True):
    return 1
else:
    return 0

请参阅validate_email文档。

ali.etemadi77 answered 2019-05-24T11:30:13Z
0 votes

查找电子邮件ID:finding IP screenshot

import re 
a=open("aa.txt","r")
#c=a.readlines() 
b=a.read()
c=b.split("\n")
print(c)
  for d in c: 
    obj=re.search(r'[\w.]+\@[\w.]+',d)
    if obj:
      print(obj.group())  
#for more calcification click on image above..
Mani answered 2019-05-24T11:30:39Z
0 votes

检查电子邮件使用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")
Vladislav Koshenevskiy answered 2019-05-24T11:31:05Z
0 votes

发现这是一个实际的实现:

[^@\s]+@[^@\s]+\.[^@\s]+
juan Isaza answered 2019-05-24T11:31:31Z
-1 votes
"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$"
Anu answered 2019-05-24T11:31:50Z
-1 votes

电子邮件验证

import re
def validate(email): 
    match=re.search(r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9]+\.[a-zA-Z0-9.]*\.*[com|org|edu]{3}$)",email)
    if match:
        return 'Valid email.'
    else:
        return 'Invalid email.'
Gaurav Nagpure answered 2019-05-24T11:32:16Z
-2 votes

区分真实有效电子邮件地址与无效电子邮件地址的唯一真正准确方法是向其发送邮件。 什么算作电子邮件令人惊讶的复杂("John Doe" <john.doe@example.com>"实际上是一个有效的电子邮件地址),你很可能希望电子邮件地址以后实际发送邮件给它。 在通过一些基本的健全性检查后(例如在Thomas的回答中,在@之后有@和至少一个.),您应该只是发送一封电子邮件验证信到该地址,并等待用户关注嵌入的链接 在邮件中确认电子邮件是有效的。

SingleNegationElimination answered 2019-05-24T11:32:44Z
translate from https://stackoverflow.com:/questions/8022530/python-check-for-valid-email-address