Python中使用lookahead RegEx进行密码检测
我正在编写一个函数来检查密码是否符合要求。这些要求是:Python中使用lookahead RegEx进行密码检测,python,regex,regex-lookarounds,Python,Regex,Regex Lookarounds,我正在编写一个函数来检查密码是否符合要求。这些要求是: 至少8个字符 至少1个大写字母 至少1个小写字母 至少1个 这些特殊字符中至少有一个:@$!#%*& 这是我的密码: passwordCriteria = re.compile(r''' (?=.*[a-z]) (?=.*[A-Z]) (?=.*\d) (?=.*[@$!%*#?&]) [A-Za-z\d@$!#%*?&]{8,}$ ''
passwordCriteria = re.compile(r'''
(?=.*[a-z])
(?=.*[A-Z])
(?=.*\d)
(?=.*[@$!%*#?&])
[A-Za-z\d@$!#%*?&]{8,}$
''', re.VERBOSE)
如果我输入密码:Newyork@1995. 密码应符合要求
但是,当我从上述代码中删除此条件时,(?=.*\d)
。密码显然仍然符合要求
这怎么可能?此前瞻检查是否确保密码中至少有一个数字?您的正则表达式接受Newyork@1995
因为您的字符类[A-Za-z\d@$!#%*?&]
包含\d
,但是如果没有前瞻性断言,则不会强制要求必须存在数字。但还有另一个问题
在保证您的密码满足除4个前瞻断言中的8个字符长度之外的所有要求后,您真正需要匹配的是确保输入长度至少为8个字符,其中:{8,}
:
import re
passwordCriteria = re.compile(r'''
(?=.*[a-z])
(?=.*[A-Z])
(?=.*\d)
(?=.*[@$!%*#?&])
.{8,}$
''', re.VERBOSE)
m = passwordCriteria.match('aA$7xxxxxxxxx')
print(m)
m = passwordCriteria.match('aA$xxxxxxxxx')
print(m)
印刷品:
<_sre.SRE_Match object; span=(0, 13), match='aA$7xxxxxxxxx'>
None
没有一个
像您这样使用这个字符类规范和前瞻断言是完全多余的,并且可能导致潜在的维护问题。此外,除了“必需”字符外,用户可能还可以输入其他字符,例如连字符,但您的正则表达式不允许这样做。是的,它允许。但是你的论证逻辑是错误的;仅仅因为您不再使用lookahead并不意味着整数不应该匹配。例如,长度检查部分也有整数匹配。