是否有一个好方法来检查表单输入使用正则表达式,以确保它是一个正确的风格的电子邮件地址?从昨晚开始搜索,每个人都回答了关于这个话题的问题,如果它是一个子域名的电子邮件地址,似乎也有问题。
当前回答
我还没有在这里的一堆自定义正则表达式答案中看到答案,但是……
存在一个名为py3-validate-email validate_email的python库,它有3个级别的电子邮件验证,包括询问有效的SMTP服务器电子邮件地址是否有效(不发送电子邮件)。
安装
python -m pip install py3-validate-email
基本用法:
from validate_email import validate_email
is_valid = validate_email(email_address='example@example.com', \
check_regex=True, check_mx=True, \
from_address='my@from.addr.ess', helo_host='my.host.name', \
smtp_timeout=10, dns_timeout=10, use_blacklist=True)
对于那些对肮脏细节感兴趣的人,validate_email.py (source)旨在忠实于RFC 2822。
我们所做的只是将输入字符串与1进行比较 庞大的正则表达式。但是构建那个regexp 通过组装它,可以更容易地确保其正确性 从RFC定义的“令牌”。每一个符号都是 在附带的单元测试文件中测试。
你可能需要pyDNS模块来检查SMTP服务器
pip install pyDNS
或者来自Ubuntu
apt-get install python3-dns
其他回答
The only really accurate way of distinguishing real, valid email addresses from invalid ones is to send mail to it. What counts as an email is surprisingly convoluted ("John Doe" <john.doe@example.com>" actually is a valid email address), and you most likely want the email address to actually send mail to it later. After it passes some basic sanity checks (such as in Thomas's answer, has an @ and at least one . after the @), you should probably just send an email verification letter to the address, and wait for the user to follow a link embedded in the message to confirm that the email was valid.
from validate_email import validate_email
is_valid = validate_email('example@example.com',verify=True)
print(bool(is_valid))
参见validate_email文档。
电子邮件验证
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.'
没有任何意义。即使您可以验证电子邮件地址在语法上是有效的,您仍然需要检查它是否没有输入错误,并且它实际上是发送给您认为的那个人的。唯一的方法就是给他们发一封电子邮件,让他们点击一个链接来验证。
因此,最基本的检查(例如,他们没有不小心输入他们的街道地址)通常就足够了。比如:它只有一个@符号,而且至少有一个。在@:后面的部分
[^@]+@[^@]+\.[^@]+
您可能还想禁止使用空格——可能有一些有效的电子邮件地址中有空格,但我从未见过,所以这是用户错误的可能性在您这边。
如果你想要完整的支票,看看这个问题。
更新:以下是如何使用任何这样的正则表达式:
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服务器以验证地址是否存在。不过,这仍然不能保证它属于正确的人。
电子邮件地址非常复杂。下面是一个匹配每个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
但是您需要决定是需要完美的解析还是简单的代码。
推荐文章
- 如何在Python中进行热编码?
- 如何嵌入HTML到IPython输出?
- 在Python生成器上使用“send”函数的目的是什么?
- 是否可以将已编译的.pyc文件反编译为.py文件?
- Django模型表单对象的自动创建日期
- 在Python中包装长行
- 如何计算两个时间串之间的时间间隔
- 我如何才能找到一个Python函数的参数的数量?
- 您可以使用生成器函数来做什么?
- 将Python诗歌与Docker集成
- 提取和保存视频帧
- 使用请求包时出现SSL InsecurePlatform错误
- 如何检索Pandas数据帧中的列数?
- except:和except的区别:
- 错误:“字典更新序列元素#0的长度为1;2是必需的”