有没有一种方法可以使用正则表达式检查表单输入,以确保它是一个正确的样式电子邮件地址?自昨晚以来一直在寻找,如果这是一个子网站的电子邮件地址,那么回答人们关于这个主题的问题的每个人似乎都有问题。
答案 0 :(得分:231)
没有意义。即使您可以验证电子邮件地址在语法上是否有效,您仍然需要检查它是否输入错误,并且它实际上是发送给您认为它的人。唯一的方法是向他们发送电子邮件,让他们点击链接进行验证。
因此,最基本的检查(例如,他们没有意外地输入他们的街道地址)通常就足够了。例如:它只有一个@
符号,.
之后的部分中至少有一个@
:
[^@]+@[^@]+\.[^@]+
你可能也想要禁止空格 - 可能有效的电子邮件地址中包含空格,但我从未见过它,所以这是用户错误的可能性就在你身边。
如果您想进行全面检查,请查看this question。
更新:以下是您可以使用任何此类正则表达式的方法:
import re
if not re.match(r"... regex here ...", email):
# whatever
Python≥3.4具有re.fullmatch
,优于re.match
。
注意字符串前面的r
;这样,你就不需要两次逃避。
如果要检查大量正则表达式,首先编译正则表达式可能会更快:
import re
EMAIL_REGEX = re.compile(r"... regex here ...")
if not EMAIL_REGEX.match(email):
# whatever
另一种选择是使用validate_email
包,它实际上与SMTP服务器联系以验证该地址是否存在。但这并不能保证它属于合适的人。
答案 1 :(得分:55)
我还没有在自定义正则表达式的答案中找到答案,但是......
存在一个名为 validate_email 的python库,它有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
答案 2 :(得分:21)
电子邮件地址并不像看起来那么简单!例如,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"
答案 3 :(得分:9)
我找到了一种检查有效电子邮件地址的优秀(且经过测试)的方法。我在这里粘贴我的代码:
# 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)
答案 4 :(得分:4)
这通常使用正则表达式来解决。然而,解决方案有许多变化。取决于您需要的严格程度,以及是否有自定义验证要求,或者是否接受任何有效的电子邮件地址。
答案 5 :(得分:3)
电子邮件地址非常复杂。这是一个匹配每个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
但你需要决定是否需要完美的解析或简单的代码。
答案 6 :(得分:3)
import validator
is_valid = validate_email('example@example.com',verify=True)
if (is_valid==True):
return 1
else:
return 0
答案 7 :(得分:2)
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()
答案 8 :(得分:2)
如果您想从长字符串或文件中取出邮件,请尝试此操作。
([^@|\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。
另外,请注意这可能不是正确答案..但我已将其发布在此处以帮助有特殊要求的人
答案 9 :(得分:0)
查找电子邮件ID:
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..
答案 10 :(得分:0)
检查电子邮件使用情况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")
答案 11 :(得分:0)
发现这是一个实际的实现:
[^@\s]+@[^@\s]+\.[^@\s]+
答案 12 :(得分:0)
在电子邮件输入中使用此过滤器掩码:
emailMask:/[\w.\-@'"!#$%&'*+/=?^_
{|}〜] / i`
答案 13 :(得分:-1)
"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$"
答案 14 :(得分:-3)
区分真实有效电子邮件地址与无效电子邮件地址的唯一真正准确方法是向其发送邮件。什么算作电子邮件令人惊讶的复杂("John Doe" <john.doe@example.com>"
实际上是一个有效的电子邮件地址),并且您很可能希望电子邮件地址以后实际发送邮件给它。在通过一些基本的健全性检查后(例如托马斯的回答,在@
之后有一个.
和至少一个@
),您应该只是发送一封电子邮件验证信地址,并等待用户按照消息中嵌入的链接确认电子邮件是否有效。
答案 15 :(得分:-3)
电子邮件验证
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.'