前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python3 初学实践案例(4)可设定长度和密码复杂级别的生成密码脚本

Python3 初学实践案例(4)可设定长度和密码复杂级别的生成密码脚本

作者头像
FungLeo
发布2018-01-08 11:58:22
5940
发布2018-01-08 11:58:22
举报

Python3 初学实践案例(4)可设定长度和密码复杂级别的生成密码脚本

在学习 python 的第一次实战中,我就完成了一个生成密码的脚本。原文链接:https://cloud.tencent.com/developer/article/1015234

但是,在那次的实战中,最终的脚本只能设定一个参数,就是长度。我希望可以做一个更加完善的脚本,就是不但可以设定长度,并且可以设定密码复杂的等级。这样,才能满足我们在不同情况下所需要的密码。

另外,由于密码是在字典中随机取得字符组合在一起的。这个结果可能并不满足我们的想要的条件,因此,必须检查一下,如果不满足,则需要重新生成一个,直到满足为止。

好,设定我的程序的目标:

  1. 随机生成一个密码
  2. 可以指定密码的长度
  3. 可以指定密码的复杂等级
代码语言:txt
复制
1. 简单:由纯数字组成
2. 一般:数字+小写字母+大写字母
3. 复杂:数字+小写字母+大写字母+标点符号密码必须符合指定的复杂等级才输出密码最小长度为 4 位,因为复杂模式必须由四种元素构成

好,确定目标之后,我就开始准备实现这个脚本。由于之前我已经学习了 argparse 命令行参数处理的库,《argparse 命令行参数库的使用》,所以处理命令行参数对于我来说变得异常简单,我配置好之后,只需要把努力全部放在逻辑处理上即可。

实现代码

代码语言:javascript
复制
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import random
import argparse
import re

# 用字典和长度随机生成一个密码
def passwordMaker(leng, dicts):
    res = ''
    dictLen = len(dicts) - 1
    for i in range(leng):
        res += dicts[random.randint(0, dictLen)]
    return res

# 检查密码的等级
def checkPassword(passwd):
    res = ''
    if re.search(r'\d', passwd):
        res = 's'
        if re.search(r'[a-z]', passwd) and re.search(r'[A-Z]', passwd):
            res = 'c'
            if re.search(r'[_@!,.<>:;-=+/?]', passwd):
                res = 'd'
    return res

# 取得密码函数
def getPassword(leng,level,dicts):
    res = passwordMaker(leng, dicts)
    # 检查密码是否符合期望的条件,如果不负责,则重新生成一遍
    if checkPassword(res) != level:
        return getPassword(leng, level, dicts)
    return res

# 主函数
if __name__ == "__main__":
    # 设置命令行参数
    parser = argparse.ArgumentParser()
    parser.description='This program is used to generate simple or complex passwords'
    parser.add_argument("-v", "--version",action='version', version='%(prog)s 1.0')
    parser.add_argument('length', type=int, help='The length of the password (Default 8)', nargs='?')

    group = parser.add_mutually_exclusive_group()
    group.add_argument("-s", "--simple", help="The password is made up of pure numbers", action="store_true")
    group.add_argument("-c", "--commonly", help="The password is made up of numbers and letters (Default)", action="store_true")
    group.add_argument("-d", "--difficult", help="The password is made up of numbers, letters, and punctuation", action="store_true")

    # 获取命令行参数结果
    args = parser.parse_args()

    # 确定密码长度为命令行设置或者默认为8
    length = args.length or 8

    # 如果密码长度小于 4 则提示并退出
    if length < 4:
        parser.print_usage()
        print('error: The password length must be greater than 3')
        exit()

    # 设定三个等级的密码生成的词典
    sDict = '0123456789'
    cDict = 'abcdefghijkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789'
    dDict = cDict + '_@!,.:;-=+/?'
    # 根据命令行条件,打印最终的密码
    if args.simple:
        print(getPassword(length, 's', sDict))
    elif args.difficult:
        print(getPassword(length, 'd', dDict))
    else:
        # 默认输出为 一般复杂程度的密码
        print(getPassword(length, 'c', cDict))

运行结果如下

完成后小结

main 函数

之前在写代码的时候,没有关注过这个问题。但是今天看到一副图之后,深以为然,决定以后写代码就按照这个规范来写。

定义一个主函数也是非常简单的,只需要在自己写的未封装的代码前面加上如下代码即可:

代码语言:javascript
复制
if __name__ == "__main__":

正则没有研究好

我总感觉下面这句:

代码语言:javascript
复制
if re.search(r'[a-z]', passwd) and re.search(r'[A-Z]', passwd):

可以优化成一句正则就可以了,但是死活没有想出来。反正不是这样的,高人给我指点一下呗:

代码语言:javascript
复制
if re.search(r'[A-Za-z]', passwd):

还有就是,标点符号的正则,我用的是 [_@!,.<>:;-=+/?],这能叫正则吗?反正我使用 [:punct:] 没能实现我的想法。希望有高人指点呀。

好吧,总结到这里。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-12-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python3 初学实践案例(4)可设定长度和密码复杂级别的生成密码脚本
    • 实现代码
      • 完成后小结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档