菜鸟使用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 29 Python
Django静态资源URL STATIC_ROOT的配置方法
Nov 08 Python
Python开发如何在ubuntu 15.10 上配置vim
Jan 25 Python
Python中__init__.py文件的作用详解
Sep 18 Python
Python实现简单求解给定整数的质因数算法示例
Mar 25 Python
PyTorch上实现卷积神经网络CNN的方法
Apr 28 Python
PyCharm代码提示忽略大小写设置方法
Oct 28 Python
Python实现的旋转数组功能算法示例
Feb 23 Python
python3 深浅copy对比详解
Aug 12 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
Oct 30 Python
Python os库常用操作代码汇总
Nov 03 Python
Pytest allure 命令行参数的使用
Apr 18 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
探讨捕获php错误信息方法的详解
2013/06/09 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
浅谈Javascript面向对象编程
2011/11/15 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
vue弹窗组件的实现示例代码
2018/09/10 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
vue 获取视频时长的实例代码
2019/08/20 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
Pytorch自己加载单通道图片用作数据集训练的实例
2020/01/18 Python
Python 的 __str__ 和 __repr__ 方法对比
2020/09/02 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
html5读取本地文件示例代码
2014/04/22 HTML / CSS
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
绿化先进工作者事迹材料
2014/01/30 职场文书
青春寄语大全
2014/04/09 职场文书
小学领导班子对照材料
2014/08/23 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
nginx配置之并发频次限制
2022/04/18 Servers
深入理解 Golang 的字符串
2022/05/04 Golang