从a-zA-Z0-9特殊字符中生成指定数量的随机字符密码的多层for循环跳出

  师从‘百测’besttest

  今日牛老师布置了一个作业,生成一个随机密码,且要包含大写字母、小写字母、数字和特殊字符,且不能重复。

  想着先生成密码,然后用各字符去检查是否存在,使用for嵌套循环。

 1 import string
 2 l = ['abc','123','123!@#qweA']
 3 i = 0
 4 n = 3
 5 while i < n:
 6     # 从a-zA-Z0-9特殊字符中生成指定数量的随机字符
 7     #pwd = ''.join(random.sample(string.ascii_letters + string.digits + string.punctuation, 8))
 8     #使用手动输入测试脚本,请正确输入
 9     pwd = input('输入需要测试的密码:')
10     print(pwd)
11     if pwd not in l:
12         for k in string.ascii_lowercase:
13             if k in pwd:    #判断密码中是否有小写字母
14                 for o in string.ascii_uppercase:
15                     if o in pwd:    #判断密码中是否有大写字母
16                         for p in string.digits:
17                             if p in pwd:    #判断密码中是否有数字
18                                 for q in string.punctuation:
19                                     if q in pwd:    #判断密码中是否有特殊字符
20                                         l.append(pwd)
21                                         i = i + 1
22                                         break
23                                 else:
24                                     print('没有特殊字符')
25                                     break
26                         else:
27                             print('没有数字')
28                             break
29                 else:
30                     print('没有大写字母')
31                     break
32         else:
33             print('没有小写字母')
34             break
35     else:
36         print('密码已存在')
37         continue

  测试发现,当3、4层for判断要跳出时,怎么写都不能完美解决,有些教程建议使用goto,由于是新手还不准备用这么高深的东西,放弃了。

  查了下好像Python语法确实有这个缺陷,最后想了个笨方法结局,广大猿友朋友如果有好的办法请指导!

 1 import string
 2 l = ['abc','123','123!@#qweA']
 3 i = 0
 4 n = 3
 5 while i < n:
 6     # 从a-zA-Z0-9特殊字符中生成指定数量的随机字符
 7     # pwd = ''.join(random.sample(string.ascii_letters + string.digits + string.punctuation, 8))
 8     # 使用手动输入pwd测试代码
 9     pwd = input('请输入测试密码:')
10     count = 0
11     if pwd not in l:
12         count = count +1
13     else:
14         print('密码已存在')
15         continue
16     if count == 1:
17         for o in string.ascii_lowercase:
18             if o in pwd:
19                 count = count + 1
20                 break
21         else:
22             print('不包含小写字母')
23     if count == 2:
24         for p in string.ascii_uppercase:
25             if p in pwd:
26                 count = count +1
27                 break
28         else:
29             print('不包含大写字母')
30     if count == 3:
31         for q in string.digits:
32             if q in pwd:
33                 count = count + 1
34                 break
35         else:
36             print('不包含数字')
37     if count ==4:
38         for w in string.punctuation:
39             if w in pwd:
40                 l.append(pwd)
41                 i = i + 1
42                 break
43         else:
44             print('不包含特殊字符')

 

转载于:https://www.cnblogs.com/shengqi/p/11558217.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一段识别gbk文和英文的标识符正则表达式 ([a-zA-Z_]|[\x81-\xfe][\x40-\xfe])([a-zA-Z0-9_]|[\x81-\xfe][\x40-\xfe])* 原理是通过正则表达式的AST直接构造DFA自动机 下面是elalr解析形如 add(1, add(...) , ...) + (12*4) *4 这样的表达式的文法 通过这样的文法 LALR(1)可以描述几乎所有的CFG文法 也就是说可以解析 HTML JSON XML C/C++ JAVA 基本上所有的语言 网上也有很多他们的文法 可以比着写一下 %左结合 '+' '-' '*' '/'; //定义优先级与结合性%开始符 表达式; // 这句的意思是 文法的开始就是 '表达式'表达式 -> 表达式 '+' 表达式  [表达式_相加] |  // 这是表达式的5个产生式 也就是说表达式可以用5种格式组成 [] 包括的内容就是遇到这个形式的产生式将会调用什么子程序               表达式 '-' 表达式   [表达式_相减] |               表达式 '*' 表达式  [表达式_相乘] |               表达式 '/' 表达式  [表达式_相除] |               '(' 表达式 ')'         [表达式_括号] ;表达式 -> 数字 | 函数调用 ; // 这里是表达式的另外两个产生式 表达式可以是函数调用 也可以是数字数字 -> "[0-9]+" [表达式_值] ;函数调用 -> 标识符 '(' 参数列表 ')' [表达式_函数调用] ; // 函数调用的产生式 用来表述函数调用的形式参数列表 -> 参数列表 ',' 表达式 [参数表_加入] |  // 这个产生式是左递归的 只要后面出现 ',' 就会调用 参数表_加入 向数据加入后面的表达式                   表达式 [参数表_创建] ; 标识符 -> "([a-zA-Z_]|[\x81-\xfe][\x40-\xfe])([a-zA-Z0-9_]|[\x81-\xfe][\x40-\xfe])*"; // 文标识符 %无结合 为没有结合性但会定义优先级 %左结合 为左结合性以及定义优先级 %右结合 为左结合性以及定义优先级 'xxx' 单引号包裹的是 文本字面量 如 'if' 注意:内含转义 "xxx" 双引号包裹的是正则表达式 bracket 支持的正则语法比较简单 但也可以描述大部分正则了 不支持negative bracket () . * + ? []
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值