题目:
编写一个正则表达式,可以检测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
#正则捕获组从kilo_lex博主处学习参考,再写出代码的。感谢博主。