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

问题描述 投票:0回答:10

所以我有一个包含完整信用卡号码的 csv 文件。我们不需要完整的号码,所以我正在编写一个快速脚本来解析 csv 并用屏蔽表示替换抄送号码。 (除最后四个之外的所有 *)。我对 python 很陌生,并对其进行了破解,并且它有效,但为了学习,我想知道它是否可以更容易地完成。

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

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

输出正是我想要的

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

但我确信有一个更优雅的解决方案。 :) 谢谢!

python string
10个回答
23
投票

更整洁:

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

10
投票

也许稍微优雅一点:

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

请注意,我避免使用名称

str
,因为它已经是内置字符串类型的名称。使用隐藏内置名称的名称通常不是一个好主意。


9
投票

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

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

5
投票

使用格式字符串切片

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

0
投票

你可以把它弄短一点,像这样:

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

0
投票

我想要一种灵活的方式来掩盖东西,所以我想我会分享......

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")))

0
投票

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

len
str

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

我不确定这是否比原来的更“优雅”,但它就是这样。


0
投票

我们也可以使用这个功能:

def maskify(cc):
    if len(cc) < 4:
        return cc
    return "#" * (len(cc)-4) + cc[-4:]

0
投票
#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()

0
投票

您还可以这样进一步简化:

在此处输入代码`input = str(input("请输入您的信用卡号(一个连续的数字):")) x = 输入[12:16] 打印(“************”+ x)

© www.soinside.com 2019 - 2024. All rights reserved.