HJ20 密码验证合格程序
描述
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行)
数据范围:输入的字符串长度满足 1≤𝑛≤100 1≤n≤100
输入描述:
一组字符串。
输出描述:
如果符合要求输出:OK,否则输出NG
示例1
输入:
021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000
输出:
OK NG NG OK
第一次靠自己完成了70%
import sys
def is_ok(s):
if len(s)<8:
print('NG')
else:
m = [s[i:i+3] for i in range(0, len(s), 1)]
n=set(m)
if len(m) != len(n):
print('NG')
else:
a=[0,0,0,0]
for char in s:
if 'a'<= char <='z':
a[0]+=1
elif 'A'<= char <='Z':
a[1]+=1
elif '0'<= char <='9':
a[2]+=1
elif char !='\n' or ' ':
a[3]+=1
sum=0
for j in range(4):
if a[j]== 0:
sum+=1
else:
continue
if sum <2:
print('OK')
else:
print('NG')
s=input()
retult = is_ok(s)
借助re库(正则表达式模块)
import re # 导入正则表达式模块
# 定义四个正则表达式,用于匹配小写字母、大写字母、数字和特殊字符
regx = ['[a-z]', '[A-Z]', "[0-9]", '[^0-9a-zA-Z]']
while True:
try:
s = input() # 读取用户输入的字符串
# 检查字符串是否符合以下条件之一:
# 1. 字符串长度小于等于8
# 2. 字符串中有长度大于等于3的重复子串
# 3. 字符串不包含至少三种不同类型的字符(小写字母、大写字母、数字、特殊字符)
if len(s) <= 8 or re.findall(r'(.{3,}).*\1', s) or sum(len(re.findall(r, s)) and 1 for r in regx) < 3:
print('NG') # 如果满足上述任意一个条件,则输出 'NG'(不合格)
else:
print('OK') # 如果不满足上述任何一个条件,则输出 'OK'(合格)
except:
break # 如果发生异常(例如EOF),则跳出循环
findall()函数的基本语法是:re.findall(pattern, string, flags=0)。其中,pattern是正则表达式的模式和规则,string是要搜索的字符串,flags是标志位,用于控制正则表达式的匹配方式,如是否区分大小写等。