Simple function that determines cc type by number
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | def cc_type(cc_number):
"""
Function determines type of CC by the given number.
WARNING:
Creditcard numbers used in tests are NOT valid credit card numbers.
You can't buy anything with these. They are random numbers that happen to
conform to the MOD 10 algorithm!
>>> # Unable to determine CC type
>>> print cc_type(1234567812345670)
None
>>> # Test 16-Digit Visa
>>> print cc_type(4716182333661786), cc_type(4916979026116921), cc_type(4532673384076298)
Visa Visa Visa
>>> # Test 13-Digit Visa
>>> print cc_type(4024007141696), cc_type(4539490414748), cc_type(4024007163179)
Visa Visa Visa
>>> # Test Mastercard
>>> print cc_type(5570735810881011), cc_type(5354591576660665), cc_type(5263178835431086)
Mastercard Mastercard Mastercard
>>> # Test American Express
>>> print cc_type(371576372960229), cc_type(344986134771067), cc_type(379061348437448)
American Express American Express American Express
>>> # Test Discover
>>> print cc_type(6011350169121566), cc_type(6011006449605014), cc_type(6011388903339458)
Discover Discover Discover
"""
AMEX_CC_RE = re.compile(r"^3[47][0-9]{13}$")
VISA_CC_RE = re.compile(r"^4[0-9]{12}(?:[0-9]{3})?$")
MASTERCARD_CC_RE = re.compile(r"^5[1-5][0-9]{14}$")
DISCOVER_CC_RE = re.compile(r"^6(?:011|5[0-9]{2})[0-9]{12}$")
CC_MAP = {"American Express": AMEX_CC_RE, "Visa": VISA_CC_RE,
"Mastercard": MASTERCARD_CC_RE, "Discover": DISCOVER_CC_RE}
for type, regexp in CC_MAP.items():
if regexp.match(str(cc_number)):
return type
return None
if __name__ == "__main__":
import doctest
doctest.testmod(optionflags=doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE)
|
1 comment
Denis Barmenkov
12 years, 8 months ago
#
|
flag
- [0-9] is a raw value for \d
- card type can be easily determined by first digit [for your regexps] :)