import re
regex = re.compile(r"""
# Leap Years are any year that can be evenly divided by 4
# (such as 2012, 2016, etc)
# • except if it can be evenly divided by 100
# then it isn't (such as 2100, 2200, etc)
# • except if it can be evenly divided by 400,
# then it is (such as 2000, 2400)
# https://www.mathsisfun.com/leap-years.html
# -------------------------------------------------
# verify date dd/mm/yyyy; possible separators: -.,/
# valid year range: 0000-9999
^ # start anchor
# precheck xx-xx-xxxx,... add new separators here
(?=\d{2}([-.,\/])\d{2}\1\d{4}$)
(?: # day-check: non caturing group
# days 01-28
0[1-9]|1\d|[2][0-8]|
# february 29d check for leap year: all 4y / 00 years: only each 400
# 0400,0800,1200,1600,2000,...
29
(?!.02. # not if feb: if not ...
(?!
# 00 years: exclude !0 %400 years
(?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)
# 00,04,08,12,...
\d{2}(?:[02468][048]|[13579][26])
)
)|
# d30 negative lookahead: february cannot have 30 days
30(?!.02)|
# d31 positive lookahead: month up to 31 days
31(?=.(?:0[13578]|10|12))
) # eof day-check
# month 01-12
.(?:0[1-9]|1[012])
# year 0000-9999
.\d{4}
$ # end anchor
""", flags=re.MULTILINE | re.VERBOSE)
test_str = ("29/02/0000\n"
"29/02/0100\n"
"29/02/0200\n"
"29/02/0300\n"
"29/02/0400\n"
"29/02/0500\n"
"29/02/0600\n"
"29/02/0700\n"
"29/02/0800\n"
"29/02/0900\n"
"29/02/1000\n"
"29/02/1100\n"
"29/02/1200\n"
"29/02/1300\n"
"29/02/1400\n"
"29/02/1500\n"
"29/02/1600\n"
"29/02/1700\n"
"29/02/1800\n"
"29/02/1900\n"
"29/02/2000\n"
"29/02/2100\n"
"29/02/2200\n"
"29/02/2300\n"
"29/02/2400\n"
"29/02/2500")
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