有没有更好的方法在python中屏蔽信用卡号码



所以我有一个csv文件,其中包含完整的信用卡号码。。我们不需要完整的数字,所以我正在写一个快速脚本来解析csv,并用掩码表示代替cc数字。(除最后四名外的所有*)。我对python还很陌生,我把它破解了,它很有效,但为了学习,我想知道它是否可以做得更容易。

假设"str"将是一个完整的信用卡号码。但为了我的例子,我只是使用字符串"CREDITCARDNUMBER"。

str = "CREDITCARDNUMBER";
strlength = len(str)
masked = strlength - 4
slimstr = str[masked:]
print "*" * masked + slimstr

输出正是我想要的

************MBER

但我相信还有一个更优雅的解决方案谢谢

更整洁:

>>> s = "CREDITCARDNUMBER"
>>> s[-4:].rjust(len(s), "*")
'************MBER'

也许更优雅一点:

card = "CREDITCARDNUMBER"
print ("*" * (len(card) - 4) + card[-4:])

请注意,我避免使用名称str,因为它已经是内置字符串类型的名称。使用隐藏在内置名称后面的名称通常不是一个好主意。

对于那些想要保留发卡机构识别号(IIN)(以前称为"银行识别号"(BIN))的人,通常是前6位,这应该完成以下工作:

print card[:6] + 'X' * 6 + card[-4:]
'455694XXXXXX6539'

带格式字符串和分条:

'{:*>16}'.format(card[-4:])

您可以将其缩短一点,如下所示:

str = "CREDITCARDNUMBER";
print "*" * (len(str) - 4) + str[-4:];

我想要一种灵活的方法来掩盖东西,所以我想分享。。。

def mask(string, start=0, end=0, chunk=4, char="*"):
    if isinstance(string, str):
        string_len = len(string)
        if string_len < 3:
            return "input len = {}, what's the point?".format(string_len)
        if start <= 0 or end <= 0:
            start = string_len // chunk
            end = start
        if string_len <= 4:
            mask_len = string_len // 2
            start = 1 if mask_len - 1 == 0 else mask_len - 1
            end = start
        else:
            mask_len = string_len - abs(start) - abs(end)
        return string[:abs(start)] + (char * mask_len) + string[-end:]

if __name__ == "__main__":
    s = "abcdefghijklmnopqrstuvwxyz01234567890a0b0c0d0e0f1a1b1c1d1e1f2a2b"
    l = [i for i in s]
    message = "ip: {}nop: {}n"
    section = "-"*79
    print("nSTRINGS")
    print(section)
    print(message.format(s[:4], mask(s[:4])))
    print(message.format(s[:3], mask(s[:3])))
    print(message.format(s[:2], mask(s[:2])))
    print(message.format(s, mask(s)))
    print(message.format(s, mask(s,start=2,end=4,char="#")))
    print(message.format(s, mask(s,start=3,end=3,char="x")))

我认为您可以使用一个简单的正则表达式替换和两个字符串切片来获得一个可读性很好的解决方案,而不必担心strlen

import re
str = 'CREDITCARDNUMBER'
print(re.sub('.', '*', str[:-4]) + str[-4:])

我不确定这是否比原来的更"优雅",但它确实存在。

我们也可以使用这个函数:

def maskify(cc):
    if len(cc) < 4:
        return cc
    return "#" * (len(cc)-4) + cc[-4:]
#Simple code to mask 16-digit credit card number
def cardNumberHider():
    str = input("Enter the card number: ")
    masked = len(str) - 4
    slimstr = str[masked:]
    print("Your masked card number is: ", end="")
    print("*" * masked + slimstr)
cardNumberHider()

最新更新