按实践题自己写的代码,存在bug:写一个函数,它使用正则表达式,确保传入的口令字符串是强口令。强口令的 定义是:长度不少于 8 个字符,同时包含大写和小写字符,至少有一位数字。你可 能需要用多个正则表达式来测试该字符串,以保证它的强度。
不明白此处循环后输入Aa11111111返回False而aA11111111返回True的原因,还请指教。
import re
def check():
password=input('请输入一个包含大小写字母且不少于8个字符的口令')
print("将对口令:",password,"执行校验")
if re.compile(r'(.*){8,}[a-z]+[A-Z]+[0-9]+').search(password) is None :
print('您输入的口令错误:',password,'请重新输入')
return False
else:
print('您输入的口令成功:',password,'nice')
return True
while check() == False :
check()
while check() ==True :
print('您的口令录入成功')
break
else:
print('您的口令录入成功')
执行结果如下
请输入一个包含大小写字母且不少于8个字符的口令
将对口令: 执行校验
您输入的口令错误: 请重新输入
请输入一个包含大小写字母且不少于8个字符的口令Aaaa
将对口令: Aaaa 执行校验
您输入的口令错误: Aaaa 请重新输入
请输入一个包含大小写字母且不少于8个字符的口令Aa111111
将对口令: Aa111111 执行校验
您输入的口令错误: Aa111111 请重新输入
请输入一个包含大小写字母且不少于8个字符的口令Aa11111111
将对口令: Aa11111111 执行校验
您输入的口令错误: Aa11111111 请重新输入
请输入一个包含大小写字母且不少于8个字符的口令aA11111111
将对口令: aA11111111 执行校验
您输入的口令成功: aA11111111 nice
您的口令录入成功
因为你 (.*){8,}[a-z]+[A-Z]+[0-9]+ 这个表达式,可以匹配到 aA111111,但是匹配不到 Aa111111
原因是,你的[a-z]+[A-Z]+ 限制了小写在前面,大写在后面。
如果需要修改的话,要改成没有顺序限制: (.*){8,}[a-zA-Z0-9]+
if re.compile(r'(.*){8,}[a-zA-Z0-9]+').search(password) is None:
print('您输入的口令错误:', password, '请重新输入')
return False
最好在正则式在线测试网站里先测试一下语法。
你现在用的正则式匹配的是先n个小写字母,再n个大写字母,再n个数字,而且n不能为0,只要三种字符按这个先后顺序排列,就能匹配到。
[a-z]+[A-Z]+[0-9]+ 你这样写都确定了先小后大再数字的顺序,当然结果是这样,你要分开来写多个判断,一个里面不好写