使用正则表达式验证电子邮件

Posted

技术标签:

【中文标题】使用正则表达式验证电子邮件【英文标题】:Email validation using regex 【发布时间】:2020-11-04 17:53:35 【问题描述】:

我有一个电子邮件验证正则表达式。我想要实现的是,如果任何电子邮件与正则表达式模式不匹配,我只想显示那些与正则表达式匹配的字符并去掉不匹配的字符。

pattern=r'(^a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)'

例如:如果我的验证失败,因为有“'”和“?”在电子邮件中,那么我建议的电子邮件应该包含除这两个之外的所有字符。 如果输入与模式不匹配,则:

input="t'ogfni?fyevdsj@hmi.dev"    
expected output = "togfnifyevdsj@hmi.dev"

我怎样才能做到这一点? 目前我正在使用,

z=list(input)
sp=[]
for j in range(len(z)):
    result=re.findall(pattern,z[j])
    if len(result)!=0:
        sp.append(result[0])
output=''.join(sp)

但是,这给了我一个空白输出。除此之外,这种方法的另一个问题是,如果电子邮件输入有 2'@',它不会检测到异常。

谁能建议在这里进行的正确方法是什么?

【问题讨论】:

【参考方案1】:

如果您假设字符串中至少有一个@ 和至少一个.,则在您的主要验证正则表达式失败时,您可以捕获电子邮件的三个部分,并从其中删除所有不需要的字符它们并连接回“干净”的电子邮件:

import re
pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+$'
text = "t'ogfni?fyevdsj@hmi.dev"
def repl(x):
    return "@.".format(re.sub(r'[^a-zA-Z0-9_.+-]+', '', x.group(1)),
        re.sub(r'[^a-zA-Z0-9.-]+', '', x.group(2)),
        re.sub(r'[^a-zA-Z0-9.-]+', '', x.group(3)))

if re.fullmatch(pattern, text):
    print("Valid email: ".format(text))
else:
    email = re.sub(r"(.*)@(.*)\.(.*)", repl, text)
    print("Filtered email: ".format(email))

查看Python demo,输出为Filtered email: togfnifyevdsj@hmi.dev

还有另一种清理@之后的部分的方法:使用.拆分并删除所有匹配[^a-zA-Z0-9-]+的所有字符,然后将它们连接回来:

def repl(x):
    return "@".format(re.sub(r'[^a-zA-Z0-9_.+-]+', '', x.group(1)),
        ".".join([re.sub(r'[^a-zA-Z0-9-]+', '', y) for y in x.group(2).split('.')]) )

见this Python demo。

【讨论】:

感谢@Wiktor 的回答。我对 python 有点陌生,并试图理解你写的 repl 函数。如果我只是将一个字符串传递给“repl”函数,我会收到一个错误,即 str 没有属性组。这可能是一个新手问题。但是你能解释一下这个功能吗 @Roma x 是匹配数据对象,正是此时正则表达式匹配的内容。该对象具有所有匹配数据对象属性,例如.group,您可以使用它们来操作其中的内容。

以上是关于使用正则表达式验证电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中使用正则表达式进行电子邮件验证

ASP.NET 电子邮件验证器正则表达式

用于电子邮件验证的正则表达式。 [复制]

不使用正则表达式的 Java 电子邮件验证

SQL 电子邮件验证(无正则表达式)

如何在我的电子邮件验证中阅读正则表达式