Есть ли лучший способ замаскировать номер кредитной карты в Python? - PullRequest
8 голосов
/ 16 марта 2012

Итак, у меня есть CSV-файл, который содержит полные номера кредитных карт. Нам не нужен полный номер, и поэтому я пишу быстрый скрипт для анализа CSV и замены номера CC на маскированное представление.(все * кроме последних четырех).Я довольно новичок в python и взломал это, и это работает, но чтобы узнать, можно ли это сделать проще.

Предположим, что "str" ​​будет полным номером кредитной карты.Но для моего примера я просто использую строку "CREDITCARDNUMBER".

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

Вывод - именно то, что я хочуэлегантное решение.:) Спасибо!

Ответы [ 7 ]

14 голосов
/ 16 марта 2012

Тоже еще:

>>> s = "CREDITCARDNUMBER"
>>> s[-4:].rjust(len(s), "*")
'************MBER'
7 голосов
/ 16 марта 2012

Возможно, чуть более элегантно:

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

Обратите внимание, что я избегал использовать имя str, потому что это уже имя встроенного строкового типа. Обычно не рекомендуется использовать имена, скрывающие встроенные имена.

3 голосов
/ 02 июля 2013

Для тех, кто хочет сохранить Идентификационный номер эмитента (IIN) (ранее назывался «Банковский идентификационный номер» (BIN)), который обычно представляет собой первые 6 цифр, которые должны выполнять работу:

print card[:6] + 'X' * 6 + card[-4:]
'455694XXXXXX6539'
2 голосов
/ 16 марта 2012

С Формат строки и Срезы :

'{:*>16}'.format(card[-4:])
0 голосов
/ 03 августа 2018

Я думаю, что вы можете получить прилично читаемое решение, не беспокоясь о len из str, используя простую замену регулярных выражений и два фрагмента строки:

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

Я не уверен, что это более "элегантно", чем оригинал, но это так.

0 голосов
/ 15 марта 2018

Мне нужен был гибкий способ маскировки, поэтому я решил поделиться ...

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 голосов
/ 16 марта 2012

Вы можете сделать его немного короче, например:

str = "CREDITCARDNUMBER";
print "*" * (len(str) - 4) + str[-4:];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...