Validating credit card numbers in python
For various reasons I've needed to validate some credit card numbers in Python. For future reference, here's what I've come up with:
import re
def validate_cc(s):
"""
Returns True if the credit card number ``s`` is valid,
False otherwise.
Returning True doesn't imply that a card with this number has ever been,
or ever will be issued.
Currently supports Visa, Mastercard, American Express, Discovery
and Diners Cards.
>>> validate_cc("4111-1111-1111-1111")
True
>>> validate_cc("4111 1111 1111 1112")
False
>>> validate_cc("5105105105105100")
True
>>> validate_cc(5105105105105100)
True
"""
# Strip out any non-digits
# Jeff Lait for Prime Minister!
s = re.sub("[^0-9]", "", str(s))
regexps = [
"^4\d{15}$",
"^5[1-5]\d{14}$",
"^3[4,7]\d{13}$",
"^3[0,6,8]\d{12}$",
"^6011\d{12}$",
]
if not any(re.match(r, s) for r in regexps):
return False
chksum = 0
x = len(s) % 2
for i, c in enumerate(s):
j = int(c)
if i % 2 == x:
k = j*2
if k >= 10:
k -= 9
chksum += k
else:
chksum += j
return chksum % 10 == 0
Comments