如何编写符合指定规则的邮箱与密码正则表达式?现有邮箱正则存疑
邮箱与密码正则表达式修正方案
邮箱正则修正
规则回顾
- 域名需以
google.com结尾,或以(无内容或任意内容).go结尾; - 整个邮箱地址至少包含3个数字,且所有字母均为小写;
- 邮箱地址中仅包含一个
$符号。
原正则存在的问题
- 数字数量校验逻辑错误:
(?=.*[0-9]){3,}无法确保至少3个数字,这种写法只是重复预查3次,而非匹配3个数字实例; - 未限制
$的出现次数:仅用(?=.*\$)只能保证存在$,无法限制最多出现一次; - 结构缺失:预查后未定义用户名的匹配范围,导致正则无法捕获实际的邮箱字符;
- 域名部分存在无效转义:
&是HTML转义字符,应改为&,且域名前缀的字符范围未合理约束(需符合小写字母、数字的要求)。
修正后的正则表达式
import re email_pattern = re.compile(r'^(?=(.*[0-9]){3,})(?=.*\$)(?!.*\$.*\$)[a-z0-9\$]+@(google\.com|(?:[a-z0-9\-]*)\.go)$')
正则解释
(?=(.*[0-9]){3,}):正向预查,确保整个邮箱中至少包含3个数字;(?=.*\$)(?!.*\$.*\$):组合预查,确保恰好存在一个$符号;[a-z0-9\$]+:匹配邮箱用户名部分,仅允许小写字母、数字和一个$;@:邮箱用户名与域名的分隔符;(google\.com|(?:[a-z0-9\-]*)\.go):匹配域名部分,要么是google.com,要么是任意(包括空)小写字母/数字/连字符组成的前缀加.go,(?:...)用于创建非捕获组避免不必要的分组捕获。
密码正则修正
规则回顾
- 长度至少为8个字符;
- 至少包含一个大写字母和一个数字;
- 至少包含
!@#$%^中的一个特殊字符。
原正则存在的问题
- 结构逻辑错误:将所有预查放在一个组后添加
{8,},但预查是零宽断言不消耗字符,无法实现长度校验; - 多余预查:
(?=.*[a-zA-z0-9!@#$%^]*)无实际意义,未对密码字符做有效约束。
修正后的正则表达式
import re pass_pattern = re.compile(r'^(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^])[A-Za-z0-9!@#$%^]{8,}$')
正则解释
(?=.*[A-Z]):正向预查,确保存在至少一个大写字母;(?=.*[0-9]):正向预查,确保存在至少一个数字;(?=.*[!@#$%^]):正向预查,确保存在至少一个指定的特殊字符;[A-Za-z0-9!@#$%^]{8,}:匹配长度至少为8的密码字符,仅允许大小写字母、数字和指定特殊字符;^和$:确保正则匹配整个密码字符串,避免部分匹配。
内容的提问来源于stack exchange,提问作者Asal Halimi
相关产品推荐
相关产品推荐

