若要生成一个密码,有下列要求:
1.指定位数n(4<=N<=20)
2.符合密码复杂度要求,一个合格的密码必须含数字、大写字母、小写字母、特殊字符;
3.同一个密码里面出现的字符,不能在同一个密码里面重复。
4.以字母开头。
代码:
import string
import random
import re
def makepsd(n):
s=string.ascii_letters
d=string.digits
o='~@#$%^&*?_'
L=[]
for x in d+s+o:
L.append(x)
random.shuffle(L)
psd=''
first_char=random.choice(s)
chosen=set()
chosen.add(first_char)
newcode=''
for x in range(1,n):
newcode=random.choice(L)
while newcode in chosen:
newcode = random.choice(L)
chosen.add(newcode)
psd=psd+newcode
psd=first_char+psd
return psd
n=int(input("请输入密码的长度N(4<=N<=20):"))
mypsd=makepsd(n)
#print(mypsd)
def testpsd(password):
pa=[]
pa.append(re.compile(r'\d+'))
pa.append(re.compile(r'[a-z]+'))
pa.append(re.compile(r'[A-Z]+'))
pa.append(re.compile(r'[~@#$%^&*?_]+'))
isok=[]
for p in pa:
if re.search(p,mypsd):
isok.append(True)
else:
isok.append(False)
final_answer=True
for item in isok:
final_answer=final_answer and item
return final_answer
#testpsd(mypsd)
#print(testpsd(mypsd))
while not testpsd(mypsd):
mypsd=makepsd(n)
#print(mypsd)
print("生成以字母开头,包含数字、大小写字母、特殊字符组成的不重复字符的%d位密码为:%s" %(n,mypsd))