华为OD(day5)

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是标志位,用于控制正则表达式的匹配方式,如是否区分大小写等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值