我正在尝试编写代码,以验证输入的密码是否符合以下条件。
import re
tmp=[]
for i in input().split(','):
print(i)
upp=0
low=0
dig=0
sch=0
for j in i:
if j.isdigit() and dig!=1:
dig=1
elif j.isupper() and upp!=1:
upp=1
elif j.islower() and low!=1:
low=1
elif re.search("[$#@]",j) and sch!=1:
sch=1
elif dig and sch and low and upp and (len(i)>=6 and len(i)<=12)==True:
tmp+=[i]
print(i)
print(tmp)
print(','.join(tmp))
测试用例是
This @ me1,notThis,Fine @ 3456,&1234567sdfD
似乎它遍历了其中一个测试用例?
输出如下:
This@me1
notThis
Fine@3456
Fine@3456
['Fine@3456']
Fine@3456
['Fine@3456', 'Fine@3456']
Fine@3456
['Fine@3456', 'Fine@3456', 'Fine@3456']
&1234567sdfD
Fine@3456,Fine@3456,Fine@3456
不能完全确定是什么原因造成的。为什么要运行Fine @ 3456案例三次?另外,我不明白为什么第一种情况This @ me1也没有被识别为有效。
任何帮助将不胜感激!
注意:我正在repl.it上在线运行此代码:https://IroncladSoulfulKiskadee.yashvedi.repl.run <-要运行测试用例
Python 3.6.1(默认值,2015年12月,13:05:11) Linux上的[GCC 4.8.2]
ps。请忽略代码中的冗余;
谢谢。
答案 0 :(得分:1)
elif dig and sch and low and upp and (len(i)>=6 and len(i)<=12)==True:
tmp+=[i]
这不是在正确的地方发生。考虑密码This@me1
。在内部循环的最后一次迭代中,我们将执行
if j.isdigit() and dig!=1:
dig=1
然后elif
的所有内容都没有通过(包括您的最终检查)。
Fine@3456
运行3次的问题是由于非常相似的问题。
要解决:
for j in i:
if j.isdigit() and dig!=1:
dig=1
elif j.isupper() and upp!=1:
upp=1
elif j.islower() and low!=1:
low=1
elif re.search("[$#@]",j) and sch!=1:
sch=1
if dig and sch and low and upp and (len(i)>=6 and len(i)<=12)==True:
tmp+=[i]
检查所有内容后,检查条件是否成立。
(并考虑使用True
和False
而不是1
和0
。这就是它们在那里的原因。)
答案 1 :(得分:0)
也许不是在循环中检查所有单词字符,而是这样做(更易读):
import re
tmp=[]
for i in input().split(','):
if not (6 <= len(i) <= 12):
continue
if not re.search("[$#@]", i):
continue
if not re.search("[a-z]", i):
continue
if not re.search("[A-Z]", i):
continue
if not re.search("[0-9]", i):
continue
tmp.append(i)
print(','.join(tmp))