一、需求
验证用户输入的密码是否符合要求,密码的要求是:
1. 不得少于8个字符
2. 只能包含大小写字母、数字和下划线
3. 大写字母、小写字母和数字这三种类型至少要包含两种
二、基础知识
re模块(正则表达式)可以用来检验字符串是否符合某种规则,在密码合格验证程序中能起到很好的作用。
本案例主要用到了findall()和search这两个函数,下面我简单介绍一下这两个函数。
findall(序列,要检验的字符串)
我们用这个函数检验一个字符串里是否包含我们给定序列里的字符,返回的结果是一个列表,列表里包含所有符合条件的字符。
import re
result=re.findall('[a-z]','Michael Jackson')
#在字符串Michael Jackson里面寻找小写字母,[a-z]表示从a到z26个小写字母
print(result)
终端:['i', 'c', 'h', 'a', 'e', 'l', 'a', 'c', 'k', 's', 'o', 'n'] #返回的结果是Michael Jackson里所有的小写字母,重复的也算
search(序列,要检验的字符串)
这个函数跟findall的不同之处在于,它在字符串里碰到第一个符合条件的字符就返回,不会再继续找了。另外,它返回的数据不是列表的形式,为了便于观察匹配的结果,我们可以借用group()方法。
import re
result=re.search('[a-z]','Michael Jackson')
print(result.group())
终端:i #Michael Jackson里第一个小写字母i被找到了
三、代码实现
import re
#定义了一个判断密码是否合格的函数judge
def judge(password):
if len(password)<8:
print('不够8个字符')
#下面这行条件的意思是:如果密码里所有的字符都符合条件,也就是都在我正则表达式的序列里,那么findall得到的列表长度和密码本身的长度就应该是一样的;如果密码里有不符合条件的字符,那么findall得到的列表长度就会小于密码的长度(相差的部分就是那些非法字符)
elif len(re.findall('[A-Za-z0-9_]',password))<len(password):
print('有非法字符')
else:
#first代表大写字母类型,如果密码里没有大写字母,那么search就会返回None,我们就把这种字符类型记为0,也就是不存在大写字母。否则,记为1,也就是存在大写字母。后面对小写字母和数字的处理是同样的道理。
first=re.search('[A-Z]',password)
if first==None:
num1=0
else:
num1=1
second=re.search('[a-z]',password)
if second==None:
num2=0
else:
num2=1
third=re.search('[0-9]',password)
if third==None:
num3=0
else:
num3=1
#下面是统计字符类型总共有多少,不少于2则符合条件,否则就要提示用户字符类型单一。
if num1+num2+num3>=2:
print('合格')
else:
print('字符类型单一,数字、大写字母和小写字母至少要有两种')
password=input('''请输入密码.要求:
1.至少8个字符
2.只能包含数字、大小写字母和下划线
3.数字、大写字母、小写字母这三种类型至少要有两种
>>>''')
judge(password)