import re
regex = re.compile(r"^((\d{2}(?!0229))|([02468][048]|[13579][26])(?=0229))(0[1-9]|1[0-2])(0[1-9]|[12]\d|(?<!02)30|(?<!02|4|6|9|11)31)\-(\d{2})\-(\d{4})$", flags=re.MULTILINE)
test_str = ("Case 1:\n"
"Correct\n"
"Month with 31days\n"
"000131-01-1728\n"
"Month with 30days\n"
"000430-01-1728\n"
"Feb with 28days\n"
"010228-01-1728\n"
"Feb with 29days\n"
"200229-01-1728\n"
"Feb with 29days\n"
"960229-01-1728\n\n\n"
"Case 2:\n"
"Invalid\n"
"Invalid date 32nd\n"
"990132-01-1728\n"
"Invalid date 31st for april\n"
"000431-01-1728\n"
"Invalid date 29th for feb in non leap year\n"
"010229-01-1728\n"
"Invalid date 30th for feb in leap year\n"
"200230-01-1728\n"
"Invalid month 13th\n"
"201301-01-1728\n"
"Invalid month 00th\n"
"200001-01-1728\n"
"Invalid date 00th\n"
"200100-01-1728")
matches = regex.finditer(test_str)
for match_num, match in enumerate(matches, start=1):
print(f"Match {match_num} was found at {match.start()}-{match.end()}: {match.group()}")
for group_num, group in enumerate(match.groups(), start=1):
print(f"Group {group_num} found at {match.start(group_num)}-{match.end(group_num)}: {group}")
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Python, please visit: https://docs.python.org/3/library/re.html