# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"\b(?<!\d.)(3[47]\d{2}([ -]?)(?!(\d)\3{5}|123456|234567|345678|424242|545454)\d{6}\2(?!(\d)\4{4})\d{5}|((4\d|5[1-5]|65)\d{2}|6011)([ -]?)(?!(\d)\8{3}|4242|5454|1234|3456|5678|2345|4567)\d{4}\7(?!(\d)\9{3})\d{4}\7\d{4})(\b|\s)(?!.\d\d)"
test_str = ("ALL strings in the first section should match\n"
"some 4270446050075048\n"
"4270-4460-5007-5048\n"
"this:4270 4460 5007 5048.\n"
"4270 4460 5007 5048 4/20\n"
"4270 4460 5007 5048 what\n"
"4270 4460 5007 5048\n"
"4270 4460 5007 5048 12/20 \n"
"5105105105105100\n"
"5200828282828210\n\n"
"--- (the following should not match - test numbers)\n"
"5454545454545454\n"
"4123456789012345\n"
"4242424242424242\n"
"42704460500750a8\n"
"4111111111111111\n"
"5111111111111111\n"
"5555555555555555\n"
"3333333333333333\n"
"3111111111111111\n\n"
"--- (the following should NOT match)\n"
"4270 4460 5007 5048 1234\n"
"4270\n"
"4270 4460 5007 504\n"
"42811293test123\n"
"427044605007504812345083 5095 5179 5157 5219 5187 5095 <--- FALSE POSITIVE (contains valid CC but has lots of exra digits)\n"
"this:4270 4460 5007 50482\n"
"4270 4460 5007 5048 123\n"
"4270 4460 5007 5048 1234\n\n"
"Known False positive (test number):\n"
"5535 3545 5455 4444\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