# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"\b(5[1-5][0-9]{2}[ -])([0-9]{4}[ -]){2}[0-9]{4}\b|\b(5[1-5][0-9]{2})([0-9]{4}){3}\b|\b222[1-9][ -]([0-9]{4}[ -]){2}[0-9]{4}\b|\b222[1-9]([0-9]{4}){3}\b|\b22[3-9][0-9][ -]([0-9]{4}[ -]){2}[0-9]{4}\b|\b22[3-9][0-9]([0-9]{4}){3}\b|\b2[3-6][0-9]{2}[ -]([0-9]{4}[ -]){2}[0-9]{4}\b|\b2[3-6][0-9]{2}([0-9]{4}){3}\b|\b27[01][0-9][ -]([0-9]{4}[ -]){2}[0-9]{4}\b|\b27[01][0-9]([0-9]{4}){3}\b|\b2720[ -]([0-9]{4}[ -]){2}[0-9]{4}\b|\b2720([0-9]{4}){3}\b"
test_str = ("MasterCard:\n"
"Requirements: MasterCard numbers either start with the numbers 51 through 55 or with the numbers 2221 through 2720. All have 16 digits.\n\n"
"Pattern Parts:\n"
"Starts with numbers 51 through 55:\n"
"1) \\b(5[1-5][0-9]{2}[ -])([0-9]{4}[ -]){2}[0-9]{4}\\b|\\b(5[1-5][0-9]{2})([0-9]{4}){3}\\b\n\n"
"Starts with numbers 2221 through 2720:\n"
"2) \\b222[1-9][ -]([0-9]{4}[ -]){2}[0-9]{4}\\b|\\b222[1-9]([0-9]{4}){3}\\b\n"
"3) \\b22[3-9][0-9][ -]([0-9]{4}[ -]){2}[0-9]{4}\\b|\\b22[3-9][0-9]([0-9]{4}){3}\\b\n"
"4) \\b2[3-6][0-9]{2}[ -]([0-9]{4}[ -]){2}[0-9]{4}\\b|\\b2[3-6][0-9]{2}([0-9]{4}){3}\\b\n"
"5) \\b27[01][0-9][ -]([0-9]{4}[ -]){2}[0-9]{4}\\b|\\b27[01][0-9]([0-9]{4}){3}\\b\n"
"6) \\b2720[ -]([0-9]{4}[ -]){2}[0-9]{4}\\b|\\b2720([0-9]{4}){3}\\b\n\n"
"Combining 1-6 to form one pattern:\n"
"\\b(5[1-5][0-9]{2}[ -])([0-9]{4}[ -]){2}[0-9]{4}\\b|\\b(5[1-5][0-9]{2})([0-9]{4}){3}\\b|\\b222[1-9][ -]([0-9]{4}[ -]){2}[0-9]{4}\\b|\\b222[1-9]([0-9]{4}){3}\\b|\\b22[3-9][0-9][ -]([0-9]{4}[ -]){2}[0-9]{4}\\b|\\b22[3-9][0-9]([0-9]{4}){3}\\b|\\b2[3-6][0-9]{2}[ -]([0-9]{4}[ -]){2}[0-9]{4}\\b|\\b2[3-6][0-9]{2}([0-9]{4}){3}\\b|\\b27[01][0-9][ -]([0-9]{4}[ -]){2}[0-9]{4}\\b|\\b27[01][0-9]([0-9]{4}){3}\\b|\\b2720[ -]([0-9]{4}[ -]){2}[0-9]{4}\\b|\\b2720([0-9]{4}){3}\\b\n\n\n"
"Test Cases:\n"
"Should fire:\n"
"16 length, no space, start with 51-55 5123123412341234\n"
"16 length, dashes, start with 51-55 5123-1234-1234-1234\n"
"16 length, spaces, start with 51-55 5123 1234 1234 1234\n\n"
"16 length, no space, start with 2221-2720 2221123412341234\n"
"16 length, dashes, start with 2221-2720 2221-1234-1234-1234\n"
"16 length, spaces, start with 2221-2720 2221 1234 1234 1234\n\n"
"16 length, no space, start with 2221-2720 2241123412341234\n"
"16 length, dashes, start with 2221-2720 2241-1234-1234-1234\n"
"16 length, spaces, start with 2221-2720 2241 1234 1234 1234\n\n"
"16 length, no space, start with 2221-2720 2321123412341234\n"
"16 length, dashes, start with 2221-2720 2321-1234-1234-1234\n"
"16 length, spaces, start with 2221-2720 2321 1234 1234 1234\n\n"
"16 length, no space, start with 2221-2720 2705123412341234\n"
"16 length, dashes, start with 2221-2720 2705-1234-1234-1234\n"
"16 length, spaces, start with 2221-2720 2705 1234 1234 1234\n\n"
"16 length, no space, start with 2221-2720 2720123412341234\n"
"16 length, dashes, start with 2221-2720 2720-1234-1234-1234\n"
"16 length, spaces, start with 2221-2720 2720 1234 1234 1234\n\n"
"Should not fire:\n"
"16 length, no space, not start with 51-55 5623123412341234\n"
"16 length, dashes, not start with 51-55 5623-1234-1234-1234\n"
"16 length, spaces, not start with 51-55 5623 1234 1234 1234\n\n"
"16 length, no space, not start with 2221-2720 2220123412341234\n"
"16 length, dashes, not start with 2221-2720 2220-1234-1234-1234\n"
"16 length, spaces, not start with 2221-2720 2220 1234 1234 1234\n\n"
"Non 16 length, matches 51 pattern start 5123-1234-1234-123\n"
"Non 16 length, matches 2221 pattern start 2221-1234-1234-123\n\n"
"Malformed, matches 51 pattern start 51-2312-34-1234-1234 \n\n\n\n\n\n")
matches = re.finditer(regex, test_str, re.MULTILINE)
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