有没有更好的方法在 python 中屏蔽信用卡号?
Posted
技术标签:
【中文标题】有没有更好的方法在 python 中屏蔽信用卡号?【英文标题】:Is there a better way to mask a Credit Card number in python? 【发布时间】:2012-04-01 14:32:18 【问题描述】:所以我有一个包含完整信用卡号码的 csv 文件。我们不需要完整号码,所以我正在编写一个快速脚本来解析 csv 并用掩码表示替换 cc 号码。 (除最后四个之外的所有 *)。我对 python 很陌生并且破解了它,它可以工作,但为了学习,我想知道它是否可以更容易地完成。
假设“str”是一个完整的信用卡号。但是为了我的例子,我只是使用字符串“CREDITCARDNUMBER”。
str = "CREDITCARDNUMBER";
strlength = len(str)
masked = strlength - 4
slimstr = str[masked:]
print "*" * masked + slimstr
输出正是我想要的
************MBER
但我确信有一个更优雅的解决方案。 :) 谢谢!
【问题讨论】:
看这个我猜你的代码短了 1~2 行 为什么不打印最后 4 个数字?星号是必需的吗? 您可能想接受以下答案之一 到目前为止,我不会称这些答案更“优雅”。它们更短,但我认为有点神秘。一般来说,我可能更喜欢问题中的代码以提高可读性。 【参考方案1】:更整洁:
>>> s = "CREDITCARDNUMBER"
>>> s[-4:].rjust(len(s), "*")
'************MBER'
【讨论】:
感谢您的帮助!【参考方案2】:也许稍微优雅一点:
card = "CREDITCARDNUMBER"
print "*" * (len(card) - 4) + card[-4:]
请注意,我已经避免使用名称str
,因为它已经是内置字符串类型的名称。使用隐藏内置名称的名称通常不是一个好主意。
【讨论】:
【参考方案3】:对于那些想要保留Issuer Identification Number (IIN)(以前称为“银行识别号”(BIN))的人,通常是前 6 位数字,应该可以做到:
print card[:6] + 'X' * 6 + card[-4:]
'455694XXXXXX6539'
【讨论】:
【参考方案4】:使用Format String 和Slicings:
':*>16'.format(card[-4:])
【讨论】:
sweet!,我对其进行了一些修改以处理动态长度(':*>'+str(len(card) - 4)+'').format(card[-4:])
【参考方案5】:
你可以像这样缩短一点:
str = "CREDITCARDNUMBER";
print "*" * (len(str) - 4) + str[-4:];
【讨论】:
【参考方案6】:我想要一种灵活的方式来掩盖东西,所以我想我会分享...
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")))
【讨论】:
【参考方案7】:我认为您可以使用简单的正则表达式替换和两个字符串切片来获得一个可读性强的解决方案,而不必担心str
的len
:
import re
str = 'CREDITCARDNUMBER'
print(re.sub('.', '*', str[:-4]) + str[-4:])
我不确定这是否比原版更“优雅”,但确实如此。
【讨论】:
【参考方案8】:我们也可以使用这个功能:
def maskify(cc):
if len(cc) < 4:
return cc
return "#" * (len(cc)-4) + cc[-4:]
【讨论】:
【参考方案9】:#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()
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。以上是关于有没有更好的方法在 python 中屏蔽信用卡号?的主要内容,如果未能解决你的问题,请参考以下文章