# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"\b(?:(?=.{0,3}?\d)[A-Za-z\d]{4}\s??){3}\b"
test_str = ("?K9X6 6GM6 LM11 // not recognized - but it should be\n"
"!K9X6 6GM6 LM11 // not recognized - but it should be\n"
"K0X6 0GM7 LM12! // not recognized - but it should be\n"
"K1X6 1GM8 LM13@ // not recognized - but it should be\n"
"K2X6 2GM9 LM14? // not recognized - but it should be\n"
"K3X6 3GM0 LM15# // not recognized - but it should be\n"
"K4X6 4GM1 LM16* // not recognized - but it should be\n"
"K5X65GM2LM17\n"
"bla bla bla\n"
"this shouldn't be visible\n"
"spod also shouldn't be visible\n"
"but line below should be!!\n"
"K9X66GM6LM11! (see that \"!\" at the end? Help me with this)\n\n"
"K5X65GM2LM17234324122323 //wrong, text is too long\n"
"A9D24 A12E A59E3 //wrong, text block counts 5 characters!\n")
matches = re.finditer(regex, test_str)
for matchNum, match in enumerate(matches, start=1):
print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
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