菜鸟使用python实现正则检测密码合法性


Posted in Python onJanuary 05, 2016

客户系统升级,要求用户密码符合一定的规则,即:包含大小写字母、数字、符号,长度不小于8,于是先用python写了个简单的测试程序:

在写解决方案前,列一下

python正则表达式中的特殊字符:

^          表示匹配的字符必须在最前边

$          表示匹配的字符必须在最后边

*          匹配* 前面的字符0次或n次

+          匹配+ 前面的字符1次或n次

?          匹配?前面的字符0次或1次

.           (小数点)匹配除换行符外的所有字符
(x)        匹配x并记录匹配的值

x|y       匹配x或者y

{n}       这里n是一个正整数。匹配前面的n个字符

{n,}   这里n是一个正整数。匹配至少n个前面的字符

{n,m} 这里n和m都是正整数。匹配至少n个、最多m个前面的字符
[xyz]      字符列表,匹配表中的任一字符,可以通过连接字符 - 指出字符范围,如 [a-z] 表示所有小写字符

[b]        匹配一个空格

b           匹配一个单词的分界线,比如一个空格

B          匹配一个单词的非分界线

re模块匹配规则(re.match函数的第三个参数):

re.IGNORECASE       忽略文中的大小写

re.LOCALE                  处理字符集本地化

re.MULTILINE             是否支持多行匹配

re.DOTALL                  匹配一些特殊标记,例如使用.匹配\n等字符

re.VERBOSE              忽略正则表达式中的空格或者换行等字符

re.UNICODE              使用Unicode编码

#encoding=utf-8

#-------------------------------------------------------------------------------
# Name:    模块1
# Purpose:
#
# Author:   Administrator
#
# Created:   10-06-2014
# Copyright:  (c) Administrator 2014
# Licence:   <your licence>
#-------------------------------------------------------------------------------
import re

def checklen(pwd):
  return len(pwd)>=8

def checkContainUpper(pwd):
  pattern = re.compile('[A-Z]+')
  match = pattern.findall(pwd)

  if match:
    return True
  else:
    return False

def checkContainNum(pwd):
  pattern = re.compile('[0-9]+')
  match = pattern.findall(pwd)
  if match:
    return True
  else:
    return False

def checkContainLower(pwd):
  pattern = re.compile('[a-z]+')
  match = pattern.findall(pwd)

  if match:
    return True
  else:
    return False

def checkSymbol(pwd):
  pattern = re.compile('([^a-z0-9A-Z])+')
  match = pattern.findall(pwd)

  if match:
    return True
  else:
    return False

def checkPassword(pwd):

  #判断密码长度是否合法
  lenOK=checklen(pwd)

  #判断是否包含大写字母
  upperOK=checkContainUpper(pwd)

  #判断是否包含小写字母
  lowerOK=checkContainLower(pwd)

  #判断是否包含数字
  numOK=checkContainNum(pwd)

  #判断是否包含符号
  symbolOK=checkSymbol(pwd)

  print(lenOK)
  print(upperOK)
  print(lowerOK)
  print(numOK)
  print(symbolOK)
  return (lenOK and upperOK and lowerOK and numOK and symbolOK)


def main():
  if checkPassword('Helloworld#123'):
    print('检测通过')
  else:
    print('检测未通过')


if __name__ == '__main__':
  main()

平时用正则不多,不知道怎么写一个正则满足要求,用了比较笨的办法,谁知道一句正则检验的请赐教!

我们再来看一个稍微复杂些的 检测邮箱名及密码验证

代码:

main.py

# coding=gbk 
 
import re 
 
def ProcessMail(inputMail): 
  isMatch = bool(re.match(r"^[a-zA-Z](([a-zA-Z0-9]*\.[a-zA-Z0-9]*)|[a-zA-Z0-9]*)[a-zA-Z]@([a-z0-9A-Z]+\.)+[a-zA-Z]{2,}$", inputMail,re.VERBOSE)); 
  if isMatch: 
    print ("邮箱注册成功。"); 
  else: 
    print ("邮箱注册失败。"); 
  return isMatch; 
 
def ProcessPassword(inputPassword): 
  #处理正则表达式 
  isMatch = bool(re.match(r"[a-zA-Z0-9]{8}",inputPassword,flags=0)); 
 
  #用type的三位表示数字type[0],小写字母type[1],大写字母type[2]是否都具备 
  if isMatch: 
    type = [False,False,False] 
    for i in range(0,8): 
      temp = inputPassword[i] 
      if ord(temp) >= ord('0') and ord(temp) <= ord('9'): 
        type[0] = True; 
      elif ord(temp) >= ord('a') and ord(temp) <= ord('z'): 
        type[1] = True; 
      elif ord(temp) >= ord('A') and ord(temp) <= ord('Z'): 
        type[2] = True; 
    for i in type: 
      if i is False: 
        isMatch = False; 
        break; 
   
  #处理是否有重复的字符出现 
  if isMatch: 
    for i in range(0,7):  
      temp = inputPassword[i]; 
      for j in range(i + 1,8): 
        if inputPassword[j] == temp: 
          isMatch = False; 
          break; 
   
  if isMatch: 
    print ("密码注册成功。"); 
  else: 
    print ("密码注册失败。"); 
  return isMatch; 
   
if __name__ == '__main__': 
  mailState = False; 
  while mailState is False: 
    inputMail = input("输入邮箱: "); 
    mailState = ProcessMail(inputMail); 
    print ("\n"); 
#   
  passwordState = False; 
  while passwordState is False: 
    inputPassword = input("输入密码: "); 
    passwordState = ProcessPassword(inputPassword); 
    print ("\n");

输出:

输入邮箱: a.a9@sina.com 
邮箱注册失败。 

输入邮箱: 9a.aa@sina.com 
邮箱注册失败。 

输入邮箱: a.a.a@sina.com 
邮箱注册失败。 

输入邮箱: a9999@sina.com 
邮箱注册失败。 

输入邮箱: a123.banana@..com 
邮箱注册失败。 

输入邮箱: a123.banana@a..com 
邮箱注册失败。 

输入邮箱: a123.banana@sina.c 
邮箱注册失败。 

输入邮箱: a123.banana@sina.com 
邮箱注册失败。 
 
输入邮箱: a123.banana@sina.com 
邮箱注册成功。

密码的测试也满足需求,不一一列举

Python 相关文章推荐
python备份文件的脚本
Aug 11 Python
Python使用代理抓取网站图片(多线程)
Mar 14 Python
python实现指定字符串补全空格的方法
Apr 30 Python
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
May 20 Python
python套接字流重定向实例汇总
Mar 03 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
Dec 27 Python
Python爬虫DNS解析缓存方法实例分析
Jun 02 Python
python 日期操作类代码
May 05 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
Dec 20 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
Apr 20 Python
Pygame的程序开始示例代码
May 07 Python
yolov5返回坐标的方法实例
Mar 17 Python
Python字符串特性及常用字符串方法的简单笔记
Jan 04 #Python
Python实现控制台进度条功能
Jan 04 #Python
python实现网站的模拟登录
Jan 04 #Python
Python实现简单的文件传输与MySQL备份的脚本分享
Jan 03 #Python
简单介绍Python中的几种数据类型
Jan 02 #Python
简单实现python爬虫功能
Dec 31 #Python
python实现颜色空间转换程序(Tkinter)
Dec 31 #Python
You might like
discuz的php防止sql注入函数
2011/01/17 PHP
thinkphp模板继承实例简述
2014/11/26 PHP
JavaScript面向对象编程
2008/03/02 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
BootStrap select2 动态改变值的方法
2017/02/10 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
vue router使用query和params传参的使用和区别
2017/11/13 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
Python三元运算实现方法
2015/01/12 Python
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
Python3编程实现获取阿里云ECS实例及监控的方法
2017/08/18 Python
使用django-crontab实现定时任务的示例
2018/02/26 Python
matplotlib交互式数据光标实现(mplcursors)
2021/01/13 Python
python爬取股票最新数据并用excel绘制树状图的示例
2021/03/01 Python
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
ellesse美国官方商店:意大利高级运动服品牌
2019/10/29 全球购物
校园网站的创业计划书范文
2013/12/30 职场文书
残疾人小组计划书
2014/04/27 职场文书
假面舞会策划方案
2014/05/29 职场文书
竞赛口号大全
2014/06/16 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP
SpringBoot接入钉钉自定义机器人预警通知
2022/07/15 Java/Android
TS 类型兼容教程示例详解
2022/09/23 Javascript