python - 需要复杂条件下的密码验证器的帮助
问题描述
我刚开始使用 python,我正在尝试为密码构建一个简单的 python 验证。我希望密码包含 2 个大写字母、2 个小写字母和 2 个特殊字符。密码的最小长度必须为 10。这是我目前所拥有的。该代码没有给我任何错误,但我无法得到一个好的结果。非常感谢您的帮助,因此我可以理解我在这里做错了什么。
def motdepasse(motdepasse):
majuscule = 'ABCDEFGHIJKLMNOPQRSTUVXYZ'
minuscule = 'abcdefghijklmnopqrstuvxyz'
char = '[@_!#$%^&*()<>?/\|}{~:]'
while True:
motdepasse = input("Entrez un mot de passe (Doit contenir 10 caractères avec 2 majuscules, 2 minuscules et 2 caractères spéciaux): ")
valid = 0
if len(motdepasse) < 10:
print("Entrez un mot de passe valide!")
continue
elif not (motdepasse.find(majuscule)) >= 2 :
print("Entrez un mot de passe valide!")
continue
elif not (motdepasse.find(minuscule)) >= 2:
print("Entrez un mot de passe valide!")
continue
elif not (motdepasse.find(char)) >= 2 :
print("Entrez un mot de passe valide!")
continue
else:
valid = True
break
if valid == 0:
print("Mot de passe valide")
解决方案
string.find(s, sub[, start[, end]]
返回 s 中找到子字符串 sub 的最低索引,使得 sub 完全包含在 s[start:end] 中。失败时返回 -1。开始和结束的默认值以及负值的解释与切片相同。
使它成为工作的错误工具。
您正在检查整个majuscule
,minuscule
和char
字符串是否在密码中并返回它们所在的索引。
您想要做的是迭代字符并计算密码字符串中的匹配项。这样的事情应该做
majuscule = 'ABCDEFGHIJKLMNOPQRSTUVXYZ'
minuscule = 'abcdefghijklmnopqrstuvxyz'
char = '[@_!#$%^&*()<>?/\|}{~:]'
while True:
motdepasse = input("Entrez un mot de passe (Doit contenir 10 caractères avec 2 majuscules, 2 minuscules et 2 caractères spéciaux): ")
valid = 0
if len(motdepasse) < 10:
print("Invalid Length")
continue
elif not len([x for x in motdepasse if x in majuscule]) >= 2:
print("No Caps")
continue
elif not len([x for x in motdepasse if x in minuscule]) >= 2:
print("Invalid lowercase")
continue
elif not len([x for x in motdepasse if x in char]) >= 2 :
print("Invalid specials")
continue
else:
valid = True
break
if valid == 0:
print("Mot de passe valide")
输出:
λ python run.py
Entrez un mot de passe (Doit contenir 10 caractères avec 2 majuscules, 2 minuscules et 2 caractères spéciaux): Stack
Invalid Length
Entrez un mot de passe (Doit contenir 10 caractères avec 2 majuscules, 2 minuscules et 2 caractères spéciaux): stackoverflow
No Caps
Entrez un mot de passe (Doit contenir 10 caractères avec 2 majuscules, 2 minuscules et 2 caractères spéciaux): StackOverflow
Invalid specials
Entrez un mot de passe (Doit contenir 10 caractères avec 2 majuscules, 2 minuscules et 2 caractères spéciaux): Stack@Overflow!