python学习笔记-----【7.18.1日期检测】

题目:

编写一个正则表达式,可以检测DD/MM/YYY格式的日期,假设日期的范围是01~31,月份的范围是01-12,年份的范围是1000~2999。请注意,如果日期或月份是一位数字,会在前面自动加0。
该正则表达式不必检测每个月或年的正确日期;它将接受不存在的日期,例如31/02/2020或31/04/2021。
然后将这些字符串存储到名为 month、day和year的变量中,
并编写其他代码以检测它是否为有效日期。
4月、6月、9月和11月有30天,
2月有28天,其余月份为31天,
闰年2月有29天,闰年是能被4整除的年,能被100整除的年除外,除非它能被400整除。
这种计算使得用大小合理的正则表达式来检测有效日期成为不可能的事,请注意原因。

#! python3
'''
编写一个正则表达式,可以检测DD/MM/YYY格式的日期,假设日期的范围是01~31,月份的范围是01-12,年份的范围是1000~2999。请注意,如果日期或月份是一位数字,会在前面自动加0。
该正则表达式不必检测每个月或年的正确日期;它将接受不存在的日期,例如31/02/2020或31/04/2021。
然后将这些字符串存储到名为 month、day和year的变量中,
并编写其他代码以检测它是否为有效日期。
4月、6月、9月和11月有30天,
2月有28天,其余月份为31天,
闰年2月有29天,闰年是能被4整除的年,能被100整除的年除外,除非它能被400整除。
这种计算使得用大小合理的正则表达式来检测有效日期成为不可能的事,请注意原因。'''

import re
T=''                                         #全局变量引用在局部域内需要在定义函数前建立变量
F=''
date3=''
def judgeRegex(dateText):                     #判断日期是否符合正则
    global T,F,date3
    dateRegex=re.compile(r'''(^[1-9]          #day没有输入在个位数前输0的情况
                         |0[1-9]              #自己输入了0的情况
                         |[12]\d              #'10-29'的情况
                         |3[01])/             #'30\31
                         ([1-9]               #月份month
                         |0[1-9]
                         |1[0-2])/
                         ([12]\d{3})$         #年份
                         ''',re.VERBOSE)

    date2Regex=re.compile(r'^([1-9])/')       #作为捕获组
    date2=date2Regex.sub(r'0\1/',dateText)    #只有一个分组,给分组1,即日期增加0
    date3Regex=re.compile(r'/([1-9])/')       #作为捕获组
    date3=date3Regex.sub(r'/0\1/',date2)      #只有一个分组,给分组1,即月份增加0
    mo=dateRegex.search(date3)
    T=date3+' 为有效日期'
    F=date3+' 为无效日期'
    
    try:
        result=mo.groups()
    except:
        return F
    return judgeDate(result)
    
def judgeDate(date):
    day=int(date[0])
    month=int(date[1])
    year=int(date[2])
    if month in (4,6,9,11) and day<=30:
        return T
    elif month not in (4,2,6,9,11) and day<=31:
        return T
    elif month==2 and day<=29:
        if (year%4==0 and not year%400==0) or year%400==0:
            return T
        elif day<=28:
            return T
        else:
            return F
    else:
        return F
    
while True:
    text = input('请输入日期,格式DD/MM/YYYY,日期的范围是01~31,月份的范围是01-12,年份的范围是1000~2999:')
    a = judgeRegex(text)
    print(a)
    if a == F:
        print('无效日期,请重新输入。')
    else:
        break

#正则捕获组从博主处学习参考,再写出代码的。感谢博主。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值