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

有没有更好的方法在python中屏蔽信用卡号码?,python,string,Python,String,所以我有一个csv文件,其中包含完整的信用卡号码。。我们不需要完整的数字,因此我正在编写一个快速脚本来解析csv,并用一个蒙面表示替换cc数字。(除最后四个外的所有*)。我对python还很陌生,并对它进行了黑客攻击,它可以工作,但为了学习,我想知道它是否可以更容易地完成 假设“str”是一个完整的信用卡号码。但是为了我的示例,我只是使用字符串“CREDITCARDNUMBER” 输出正是我想要的 ************MBER 但我相信有一个更优雅的解决方案谢谢 也许稍微优雅一点: car

所以我有一个csv文件,其中包含完整的信用卡号码。。我们不需要完整的数字,因此我正在编写一个快速脚本来解析csv,并用一个蒙面表示替换cc数字。(除最后四个外的所有*)。我对python还很陌生,并对它进行了黑客攻击,它可以工作,但为了学习,我想知道它是否可以更容易地完成

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

输出正是我想要的

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

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

也许稍微优雅一点:

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

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

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

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

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


对于那些想要保留(IIN)(以前称为“银行识别号”(BIN))的人来说,通常是前6位数字,应该这样做:

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

我想用一种灵活的方式来掩盖这些东西,所以我想我会和大家分享

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")))
def掩码(string,start=0,end=0,chunk=4,char=“*”):
如果isinstance(字符串,str):
字符串_len=len(字符串)
如果字符串长度<3:
返回“input len={},要点是什么?”.format(string_len)

如果start我认为您可以使用一个简单的正则表达式替换和两个字符串片段获得一个可读性良好的解决方案,而不必担心
str
len

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:]
def maskify(cc):
如果len(cc)<4:
返回cc
返回“#”*(len(cc)-4)+cc[-4:]

通过查看此图,我猜您的代码1~2行变短了,为什么不打印最后4个数字?星号是必要的吗?你可能想接受这些答案中的一个。到目前为止,我不认为答案更“优雅”。它们比较短,但我觉得有点神秘。一般来说,出于可读性考虑,我可能更喜欢问题中的代码。谢谢你的帮助!太好了!,我对它进行了一些修改,以处理动态长度
(“{:*>”+str(len(card)-4)+'})。格式(card[-4:])
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:]