Python 如何使用正则表达式验证电子邮件地址
本教程将教你如何使用正则表达式验证给定的电子邮件地址。 正则表达式是一种重要的技术,用于搜索文本和替换操作,验证,字符串拆分和许多其他操作。 它们提供了一组规则来识别特定的字符和数字,以使模式与我们要查找的特定文本段匹配。
正则表达式以模式匹配而闻名,各种编程语言具有不同的接口表示它们以匹配结果。
让我们看看如何为电子邮件验证编写正则表达式。
通用电子邮件正则表达式
没有这样的正则表达式,可以匹配每个可能的有效电子邮件地址。 虽然,我们可以编写一个正则表达式,可以匹配大多数有效的电子邮件地址。 首先,我们必须定义要查找的电子邮件地址格式。 以下是最常见的电子邮件格式。
(user_name)@(domain_name).(top-leveldomain)
因此,我们可以记录@符号的模式,将前缀与域段分开。 user_name是包含大写字母,小写字母,数字和一些特殊字符的有效字符串。
domain_name是由.(点)符号分隔的顶级域。 域名也可以有大写字母,小写字母和-(连字符)符号。 顶级域可以是.com,.in,.edu,.co或至少两个字符长。
正则表达式如下所示。
(string1)@(string2)。(2+characters)
上面的表达式准确匹配以下电子邮件。
sachin.sharma@gmail.com
mathew123@yahoo.co.uk
peter@outlook.co
相同的正则表达式在以下类型的电子邮件地址中可能会失败。
peterdinklage@gmail
khalisi123@...uk
john@outlook.
根据正则表达式,字符串不应包含特殊字符。 此外,顶级域可能无效。 我们可以将这些规则列入具体表达式中,该表达式考虑了比第一个表示更多的情况。
([A-Za-z0-9]+ [.-_])* [A-Za-z0-9] +@ [A-Za-z0-9-] +(\ .[AZ | az] {2,})+
我们不能在@符号之前使用前缀,也不能以它开头,因此我们确保每个特殊字符前面至少有一个字母数字字符。 顶级域可以用一个点分开。
正则表达式比第一个更复杂,但它涵盖了我们定义的正则表达式的所有规则。 然而,对于一些边缘情况,它又会失败。
使用Python验证电子邮件地址
Python提供了re模块,其中包含用于表示和处理Python中的正则表达式的类和方法。 我们将在Python脚本中使用此模块和re.fullmatch(pattern,string,flags)方法。 如果整个字符串与模式匹配,则此方法返回匹配对象。 如果未匹配,则返回无。 让我们了解以下Python代码。
示例 –
import re
regex = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+')
def emailValid(email):
if re.fullmatch(regex, email):
print("The given mail is valid")
else:
print("The given mail is invalid")
emailValid("sachin.sharma@gmail.com")
emailValid("johnsnow123@yahoo.co.uk")
emailValid("mathew123@...uk")
emailValid("...@domain.us")
输出:
The given mail is valid
The given mail is valid
The given mail is invalid
The given mail is invalid
解释 –
在上面的代码中,我们使用了compile()方法,它将正则表达式编译为正则表达式对象,通常用于在尝试多次匹配模式时提高效率。然后,我们定义了一个函数,它使用re.fullmatch()方法,它使用正则表达式和电子邮件作为参数,如果给定的邮件完全匹配,则返回匹配对象并打印消息。
强壮的电子邮件正则表达式
早些时候,我们编写了适用于大多数情况并与合理的应用程序配合使用的正则表达式。然而,我们可以编写更强大的正则表达式。长表达式往往容易混乱和难以阅读,而这个表达式也不例外。
(?:[a-z0-9!#%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#%&'*+/=^_`{|}~-]+)*
|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]
|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")
@
(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
|\[(?:(?:(2(5[0-5]|[0-4][0-9])
|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])
|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]
|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
现在我们编写强壮的电子邮件验证的脚本。让我们理解以下示例。
示例 –
import re
regex = re.compile(r"([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\"([]!#-[^-~ \t]|(\\[\t -~]))+\")@([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*])")
def emailValid(email):
if re.fullmatch(regex, email):
print("给定的电子邮件有效")
else:
print("给定的电子邮件无效")
emailValid("sachin.sharma@gmail.com")
emailValid("johnsnow123@yahoo.co.uk")
emailValid("mathew@...uk")
emailValid("...@domain.us")
输出:
The given mail is valid
The given mail is valid
The given mail is invalid
The given mail is invalid
结论
本教程介绍了使用正则表达式验证电子邮件的多种方法,主要取决于我们要查找的特定格式。与此相关的是,没有适用于所有邮件格式的唯一模式; 我们需要定义我们希望格式遵循的规则并相应地构造模式。
每个新规则都会降低接受地址的自由程度。