正则表达式只验证python中三种特定格式的信用卡号

时间:2015-10-20 03:08:48

标签: python regex

我正在尝试将regex写入自定义验证万事达卡和签证卡。如果字符串是除下面提到的三种格式之外的任何内容,则re.match应返回None

这是我到目前为止的万事达卡

regex = "^5[1-5][-0-9 ]+"
print re.match(regex, "5455-1107-!64220469")

返回一个对象。应该返回None

对于签证我有正则表达式

regex = "^4[0-9]{12}(?:[0-9]{3})?"

只接受格式

1234123412341234
1234-1234-1234-1234
1234 1234 1234 1234

任何其他形式的格式都应返回None

如何改进我的正则表达式,还是应该以其他方式处理?

感谢任何帮助。

4 个答案:

答案 0 :(得分:0)

如果您担心双破折号等问题,使用正则表达式解决此验证并非易事,至少如果您想确保同时拥有一个或四个块。这是一种更具抵抗力的方法:

import re


def check_valid_credit_card_format(card):
    parts = re.split(' |-', card)

    if len(parts) == 1:
        if len(parts[0]) != 16:
            # print 'Credit card does not consist of 16 digits.'
            return False
    elif len(parts) == 4:
        if not all(len(part) == 4 for part in parts):
            # print 'Credit card does not consist of 4 blocks of 4 digits each.'
            return False
    else:
        # print 'Credit card consists of an invalid number of blocks.'
        return False

    if not all(part.isdigit() for part in parts):
        # print 'Credit card does not only contain digits.'
        return False

    return True


def get_vendor_for_credit_card(card):
    if card.startswith('4'):
        return 'Visa'

    if re.match('^5[1-5]', card):
        return 'MasterCard'

    return None


if check_valid_credit_card_format(credit_card):
    print get_vendor_for_credit_card(credit_card)
else:
    print 'Invalid format.'

首先,我们检查信用卡的格式是否有效。有效格式是一个16位数的块或四个四位数的块 如果是,我们检查卡所属的供应商。在Visa的情况下,你甚至不需要正则表达式。

备注: 如果信用卡被破折号和空格分成4个区块,则该测试不会失败,例如1234 1234-1234 1234。这可能是也可能不是你想要的 此外,可能不是最快的方法,因此根据您的应用程序,您可能希望对其进行优化。这里的这个片段只是为了让您更容易看到正在发生的事情。

答案 1 :(得分:0)

试试这个:regex =“[\ d] +(( - | \ s)?[\ d] +)+”

在线测试此正则表达式   - Pythex.org

  

它会接受像

这样的格式      

1234123412341234,1234-1234-1234-1234,1234 1234 1234 1234

答案 2 :(得分:0)

您可以使用:

\d{4}[\s\-]*\d{4}[\s\-]*\d{4}[\s\-]*\d{4}

答案 3 :(得分:0)

在匹配后,你的正则表达式都没有检查无效字符。您需要锚定匹配的结尾以拒绝接受表达式后的内容。

因此,例如,re.match("^5[1-5][-0-9 ]+", "51 foo")匹配,并且第三个字符之后的任何内容都可能是完全垃圾。一个微不足道的修复将是"^5[1-5][-0-9 ]+$"(注意结尾处的美元锚点)但是仍然没有做任何事情来检查输入的长度。

您的示例都显示十六位数字,因此您只需执行

即可
regex=r'[45]\d{3}(?:[- ]?\d{4}){3}$'

允许数字组之间的可选短划线或空格。这是四个或五个,后跟三个数字,然后是三组四个数字,带有可选的前导空格或短划线。

如果输入来自在线表格,例如,您可能对重复的空格或破折号更宽松,并且可能只是预处理输入以删除任何非数字,然后检查长度为16和确认第一个数字是您接受的数字。