import re
regex = re.compile(r"^(=?202\d)(\d{0,3}[A-Z]{1,4}|[A-Z]{1,4}\d{1,3})([\dA-Z]{0,4})A", flags=re.MULTILINE)
test_str = ("Matches R1 R2 R3 R4 R5 R6\n"
"2022A144A OK OK OK OK \\D\\d\\d\\d\n"
"20228BC3A OK OK OK OK \\d\\D\\D\\d\n"
"20228Z1DA OK OK OK OK \\d\\D\\d\\D\n"
"2022K2 A \n"
"20229999A NOK \\d\\d\\d\\d\n"
"2022B123A OK OK OK OK \\D\\d\\d\\d\n"
"20221B23A OK OK OK OK \\d\\D\\d\\d\n"
"202212B3A NOK NOK NOK OK OK \\d\\d\\D\\d\n"
"2022123BA NOK OK \\d\\d\\d\\D\n"
"2022ABCDA \n"
"2022K2 A \n\n"
"Matches 100% as desired\n"
"R 12 2022(\\d\\D\\w\\w|\\D\\d\\w\\w|\\d\\d\\D\\w|\\d\\d\\w\\D|\\D\\D\\D\\D)A\n"
"R 13 ^(=?202\\d)(\\d{0,3}[A-Z]{1,4}|[A-Z]{1,4}\\d{1,3})([\\dA-Z]{0,4})A\n\n\n"
"Should match\n"
"R1: 2022\\d\\D\\w\\wA\n"
"R2: 2022\\D\\d\\w\\wA\n"
"R3: 2022(\\d\\D\\w\\w|\\D\\d\\w\\w)A\n"
"R4: 2022(\\d\\D\\w\\w|\\D\\d\\w\\w|\\d\\d\\D\\w)A\n"
"R5: 2022(\\d\\D\\w\\w|\\D\\d\\w\\w|\\d\\d\\D\\w|\\d\\d\\w\\D)A\n\n"
"R 10 ^(=?202\\d)(\\d*[A-Z]|[A-Z]*)([\\dA-Z]{1,3})A\n"
"R 11 ^(=?202\\d)(\\d{1,3}[A-Z]*)([\\dA-Z]{1,3})A\n"
"R 12 ^(=?202\\d)(\\d{1,3}[A-Z]{1,3}|[A-Z]{1,3}\\d{1,3})([\\dA-Z]{0,3})A\n\n\n\n"
"^ Start of string\n"
"(?=[a-z\\d]{8,}$) Positive lookahead, assert 8 or more chars a-z or digits till end of string\n"
"(?=\\d*[a-z]) Positive lookahead to assert at least a char a-z\n"
"[a-z]* Match optional chars a-z\n"
"\\d Match at least a single digit\n"
"[a-z\\d]* Match optional chars a-z or digits\n"
"$ End of string\n\n"
"Should not match\n"
"R6: 2022([A-Z0-9]{1,4})A\n"
"R7: 2022(\\d|\\w){1,3}\\wA <-- also matches 20229999A which it should not\n"
"R8: 2022\\w\\w\\s\\sA\n"
"R9 2022\\d\\d\\d\\dA")
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