用Python的re模块实现密码合格验证程序

一、需求

验证用户输入的密码是否符合要求,密码的要求是:

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)  

 

 

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
纯属练习 可以用来当做众多小程序(例如你的练习程序)的总控制程序,第一次进入提示创建密码,以后就要输入密码,用文件保存密码,按程序代号进入相应的程序。 不足:忘了隐藏密码字符。 即,密码用 **** 表示,这个已经修正了,代码如下: #include #include #include int string_same(char *string_1,char *string_2);/*判断两个字符串是否一致的子函数原型*/ void enter_mima(char *enter_1); //输入密码时,用“*”代替密码 int main(void) { FILE *mimawenjian; /*密码文件变量*/ char mima_1[30],mima_2[30];//用来储存密码的数组 int loop_1; char dh_1[6];//用于记录输入的程序代号 printf(" 欢迎进入程序控制台\n"); printf("--------------------------------------------------------------------------------"); /****************************************************************************************************************************/ if ((mimawenjian/*密码文件变量*/=fopen("password","r"))==NULL) /*判断密码文件是否存在,以下的程序代码是假设的密码文件不存在*/ { mimawenjian/*密码文件变量*/=fopen("password","w"); //这里表示,既然没密码文件那就新建一个可以写入文件的密码文件 printf("这是你第一次使用本程序,请设置登录密码!\n"); for(;;) /*循环输入密码,直到两次输入的密码一致*/ { printf("请输入你要设置的密码:"); //scanf("%s",mima_1);fflush(stdin); enter_mima(mima_1);fflush(stdin); printf("请再次输入设置的密码:"); //scanf("%s",mima_2);fflush(stdin); enter_mima(mima_2);fflush(stdin); if(string_same(mima_1,mima_2)==1) break; /*这里的意思是,如果两次输入的密码一致时,就跳出循环,准备写入密码*/ else printf("提示:密码输入错误,请重新设置!\n"); /*这里的意思是,如果两次输入的密码不一致时,就提示密码输入错误*/ } printf("你的密码是:%s,请妥善保管!\n",mima_1); fputs(mima_1,mimawenjian); /*将密码写入密码文件*/ fclose(mimawenjian);//关闭密码文件 } /*********************************************************************************************************************************/ //********************************************************************************************************************************* else /*判断密码文件是否存在,以下的程序代码是假设的密码文件存在*/ { //------------------------------------------------ char *n=mima_1,i; // while (( i=fgetc(m
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值