python - 使用正则表达式验证电子邮件
问题描述
我有一个电子邮件验证正则表达式。我想要实现的是,如果任何电子邮件与正则表达式模式不匹配,我只想显示那些与正则表达式匹配的字符并去掉不匹配的字符。
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'@',它不会检测到异常。
谁能建议在这里进行的正确方法是什么?
解决方案
如果您假设字符串中至少有一个@
且至少有一个.
,则在您的主要验证正则表达式失败时,您可以捕获电子邮件的三个部分,并从中删除所有不需要的字符并连接回“干净“ 电子邮件:
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 演示,输出为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('.')]) )
请参阅此 Python 演示。
推荐阅读
- python - Python 错误:ValueError:长度不匹配:预期轴有 4 个元素,新值有 5 个元素
- python - 从python中的文本文件中获取特定的行和数据
- node.js - 使用 Git 和 Node/Npm 进行多部分项目的良好项目设置
- trace32 - 如果启用断点,Lauterbach Trace 32 ICE 再次进入 main
- javascript - 如何创建一个不会在旧浏览器上导致错误的 ES6 模块?
- javascript - VUE CLI - 如何导入脚本和样式
- git - 在存储库目录外使用 git 远程命令
- php - WordPress 编辑器未更新文件:无法与站点通信以检查致命错误
- class - 两个类之间操作的 OCL 键
- javascript - 使用 sinon 时出现不一致的 UnhandledPromiseRejectionWarning