2021-11-15 正则表达式练习,邮箱,密码,手机号验证

题目

a. 提示用户输入邮箱地址,如果用户输入的邮箱地址不符合规范,告诉用户 重新输入
(1) 邮箱地址用户名部分是一个或多个字符,字符可以包括:小写和大写字母,数字,句点,下划线,百分号,加号,或者短横。
(2) 用@符合分割
(3) 域名只允许字母,数字,句号和短横,可以有2到4个字符。
b. 用户输入了正确格式的email以后,如果它输入的是qq.com域名,则打印“我也用qq邮箱“
c. 提示用户输入密码
(1) 密码长度要求大于8个字符
(2) 密码需要包含至少一个小写字母,至少一个大写字母,至少一个数字,至少一个特殊字符
(3) 特殊字符为:@,#,$,%,&,^,* (英语输入法下的特殊字符) 如果用户输入的密码不符合要求,告知用户哪些个要求不满足,并要求用户重新输入
d. 提示用户输入联系电话
(1) 电话可以是手机号码或者座机号码
(2) 需要可以处理这些格式的输入:
a) 19587462039
b) 187-9874-8794
c) (+86) 19256448794
d) +8619256448794
e) +86 187-9874-8794
f) 0512-64309852
g) (0512)-67239852
h) 0512 67294158
i) 051267294158
如果用户输入的格式不在这些格式中,提示用户手机号码11位,固话区号4位,号码8位。
(3) 如果用户输入的是手机号码开头3位:176/175(联通)、173/177(电信)、172/178(移动)开头,打印“你用的是联通/电信/移动运营商“
(4) 如果用户输入的是固话,并且区域号0512,打印“你的固话地址在苏州“
e. 最后程序打印用户输入正确的邮箱,密码,电话号码,再退出

代码部分

#lab2 02
import re
#接受邮箱地址
emailModle = r"([a-zA-Z0-9.%+-]+)@([a-zA-Z0-9.-]+)(\.[a-zA-Z]{2,4})"
'''
观察题目,将邮箱对应的划分为三个分组
第一分组为邮箱地址的用户名部分,将合法的字符放在一个字符分类,并用 + 来表示合法的字符必须包含一个或者多个
第一分组和第二分组,也就是域名与用户名之间用 @ 分隔
第二分组同样将合法的字符放在一个字符分类,并用 + 来表示合法的字符必须包含一个或者多个
第三分组,也就是顶级域名部分,必须包含一个dot,和二到四个的字母(忽略大小写)
'''
emailegrep = re.compile(emailModle)
while True:
    email = input("Please enter you email:")
    try:
        emailMo =emailegrep.search(email)
        #Regex对象的search()方法查找传入的字符串,如果在字符串中找到该正则表达式的模式,返回一个Match对象,否则返回None
        if email != (emailMo.group(1)+'@'+emailMo.group(2)+emailMo.group(3)):
            #把用户输入的邮箱和group方法取得匹配的文本进行比较,如果用户输入的邮箱信息符合规定,就能被模式完整匹配,否则让用户重新输入
            print("输入的邮箱地址不符合规范!")
            continue
        if emailegrep.sub(r"\2\3",email) == "qq.com":
            #通过取得2,3分组中的字符串与"qq.com"比较
            print("我也用QQ邮箱") 
        break
    except AttributeError:
        print("输入的邮箱地址不符合规范!")
#处理邮箱密码
#在判断分组时,会将每个字符分配给已知的元组中对应列表的位置
flag = True
feedBack = {0:"至少包含一个小写字母",1:"至少包含一个大写字母",2:"至少一个数字",3:"至少一个特殊字符"}
passModle = r"([a-z])?([A-Z])?(\d)?([@#$%&^*])?"#不用担心判断一次就结束,贪婪模式
'''
因为要了解具体的一些文本是否出现过,所以划分为四个分组
第一分组包含小写字母,第二分组包含大写字母,第三分组为数字,第四分组为特殊字符
遇到一个密码中的字符,就与模式匹配四个分组匹配,匹配的次数为输入密码的长度,匹配的结果是在列表中添加一个元组
'''
passgrep =re.compile(passModle)
while flag: 
    passWorld = input("请输入密码 :")
    if len(passWorld) <= 8 :
        print("密码长度要求大于8个字符")
        continue
    passcheck = passgrep.findall(passWorld)#passcheck是一个元组的列表
    for i in range(4):
        flag = True
        for j in range(len(passcheck)):
            if passcheck[j][i] != '':#因为有四项要判断,当我检测到某一项存在一个就直接检查下一项,否则就代表从头到尾这一项都没出现,就利用存在的字典,进行输出
                flag = False
                break
        if flag:
            print(feedBack.get(i))
            break
#处理联系电话
flag2 = True
# phoneModle = r"(\(?\+86\)?)?\s*(\d{3})-?(\d{4})-?(\d{4})|\(?(\d{4})\)?\s*-?(\d{8})"
phoneModle = r"\(?(\d{4})\)?\s*-?(\d{8})|(\(?\+86\)?)?\s*(\d{3})-?(\d{4})-?(\d{4})"
'''
整体上包含有两种匹配模式,一个是手机号码,另一个是固定电话
固定电话中包含两个分组
第一个分组两边紧跟着的是有可能存在的括号,用 \(? 来匹配左括号,右括号同理。第一分组中 (\d{4}) 是来匹配固话的前四位。
同时第一分组后面还能存在空格和短横,用 \s* 与 -? 来匹配
第二分组简单一些,就是匹配八位数字
手机号码包含四个分组
第一个分组里面,我使用 \( \) 去匹配存不存在都有可能的(),然后用 \+ 来匹配是一个加号,最后里面的86就是匹配正常的文本86,文本最后可能存在零个或者多个空格,使用 \s*
第二个分组匹配的是三个数字,第二个分组与第三个分组之间可能包含一个 - 就使用 -* 来匹配
第三个分组匹配的是四个数字,第三个分组与第四个分组之间可能包含一个 - 就使用 -* 来匹配
第四个分组匹配四个数字
'''
phoneegrep = re.compile(phoneModle)
while flag2:
    phoneNUM = input("请输入联系电话:")
    try : 
        phoneMo = phoneegrep.match(phoneNUM)
        # print(phoneMo)
        # print(phonede.group())
        if phoneMo.group() != phoneNUM:
            #用group来整个匹配到的文本与用户输入比较
            print("输入格式不正确!(提示用户手机号码11位,固话区号4位,号码8位)")
            continue
        break
    except (IndexError,TypeError,AttributeError):
        print("输入格式不正确!(提示用户手机号码11位,固话区号4位,号码8位)")
#利用sub方法返回的是字符串,匹配        
if len(phoneegrep.sub(r"\4\5\6",phoneNUM)) == 11 :#首先是手机号,才能进行一下判断
    if phoneegrep.sub(r"\4",phoneNUM) in ["176","175"]:#判断分组三匹配的信息是否在列表中
        print("你用的是联通运营商!")
    elif phoneegrep.sub(r"\4",phoneNUM) in ["173","177"]:
        print("你用的是电信运营商!")
    elif phoneegrep.sub(r"\4",phoneNUM) in ["172","178"]:
        print("你用的是移动运营商!")
elif phoneegrep.sub(r"\1",phoneNUM) == "0512":
    print("你的固话地址在苏州")
#最后简单的输出        
print("你的邮箱地址是:{}\n你的邮箱密码是:{}\n你的电话号码是:{}".format(email,passWorld,phoneNUM))

初学者练习,欢迎指正~

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值