Welcome, guest | Sign In | My Account | Store | Cart

Simple function that determines cc type by number

Python, 49 lines
 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 10 years, 4 months ago  # | flag
  • [0-9] is a raw value for \d
  • card type can be easily determined by first digit [for your regexps] :)
Created by Paul Saparov on Mon, 1 Aug 2011 (MIT)
Python recipes (4591)
Paul Saparov's recipes (1)

Required Modules

Other Information and Tasks