python 数据脱敏

自己写的一个脱敏方法,感觉不是很理想,发出来希望能和大家一起优化一下!

自己写的一个脱敏方法,感觉不是很理想,发出来希望能和大家一起优化一下!

自己写的一个脱敏方法,感觉不是很理想,发出来希望能和大家一起优化一下!


def check_idcard(idcard):
    """
    身份证号码校验
    :param idcard:
    :return:
    """
    message = ''
    errors = ['验证通过!', '身份证号码位数不对!', '身份证号码出生日期超出范围或含有非法字符!', '身份证号码校验错误!', '身份证地区非法!']
    area = {"11": "北京", "12": "天津", "13": "河北", "14": "山西", "15": "内蒙古", "21": "辽宁", "22": "吉林", "23": "黑龙江",
            "31": "上海", "32": "江苏", "33": "浙江", "34": "安徽", "35": "福建", "36": "江西", "37": "山东", "41": "河南", "42": "湖北",
            "43": "湖南", "44": "广东", "45": "广西", "46": "海南", "50": "重庆", "51": "四川", "52": "贵州", "53": "云南", "54": "西藏",
            "61": "陕西", "62": "甘肃", "63": "青海", "64": "宁夏", "65": "新疆", "71": "台湾", "81": "香港", "82": "澳门", "91": "国外"}
    idcard = str(idcard)
    idcard = idcard.strip()  # 删除前后空格
    id_card_list = list(idcard)

    # 地区校验
    if not area[idcard[0:2]]:
        return {"status": False, "message": "身份证地区非法!"}

    # 15位身份号码检测
    if len(idcard) == 15:
        if ((int(idcard[6:8]) + 1900) % 4 == 0 or (
                (int(idcard[6:8]) + 1900) % 100 == 0 and (int(idcard[6:8]) + 1900) % 4 == 0)):
            e_reg = re.compile(
                '[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|'
                '[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$')  # //测试出生日期的合法性
        else:
            e_reg = re.compile(
                '[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|'
                '[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$')  # //测试出生日期的合法性
        if re.match(e_reg, idcard):
            return {"status": True, "message": "验证通过!"}
        else:
            return {"status": False, "message": "身份证号码出生日期超出范围或含有非法字符!"}

    # 18位身份号码检测
    elif len(idcard) == 18:
        # 出生日期的合法性检查
        if int(idcard[6:10]) % 4 == 0 or (int(idcard[6:10]) % 100 == 0 and int(idcard[6:10]) % 4 == 0):
            e_reg = re.compile(
                '[1-9][0-9]{5}(19[0-9]{2}|20[0-9]{2})((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)'
                '(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$')  # //闰年出生日期的合法性正则表达式
        else:
            e_reg = re.compile(
                '[1-9][0-9]{5}(19[0-9]{2}|20[0-9]{2})((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)'
                '(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$')  # //平年出生日期的合法性正则表达式
        # //测试出生日期的合法性
        if re.match(e_reg, idcard):
            # //计算校验位
            S = (int(id_card_list[0]) + int(id_card_list[10])) * 7 + (int(id_card_list[1]) +
                                                                      int(id_card_list[11])) * 9 + (
                        int(id_card_list[2]) + int(id_card_list[12])) * 10 + (
                        int(id_card_list[3]) + int(id_card_list[13])) * 5 + (
                        int(id_card_list[4]) + int(id_card_list[14])) * 8 + (
                        int(id_card_list[5]) + int(id_card_list[15])) * 4 + (
                        int(id_card_list[6]) + int(id_card_list[16])) * 2 + int(id_card_list[7]) * 1 + int(
                id_card_list[8]) * 6 + int(id_card_list[9]) * 3
            Y = S % 11
            M = "F"
            JYM = "10X98765432"
            M = JYM[Y]  # 判断校验位
            # print(S)
            # print(Y)
            # print(M)
            if M == id_card_list[17]:  # 检测ID的校验位
                return {"status": True, "message": "验证通过!"}
            else:
                return {"status": False, "message": "身份证号码校验错误!"}
        else:
            return {"status": False, "message": "身份证号码出生日期超出范围或含有非法字符!"}
    else:
        return {"status": False, "message": "身份证号码位数不对!"}

from LAC import LAC
lac = LAC(mode='lac')

def data_cleaning(content):
    # 身份证号码
    id_card_list = re.findall(r"\d{18}|\d{17}[xX]|\d{15}", content)
    if id_card_list:
        for i in id_card_list:
            if len(i) == 18:
                content = content.replace(i, i.replace(i[10:16], "*" * 6))
            else:
                content = content.replace(i, i.replace(i[7:13], "*" * 6))

    # 手机号
    telephone = re.findall(r"1[3456789]\d{9}", content)
    if telephone:
        for i in telephone:
            content = content.replace(i, i.replace(i[3:7], "*" * 4))

    # 人名
    lac_result = lac.run(content)
    for i in range(len(lac_result[0])):
        if lac_result[1][i] == 'PER':
            person_name = lac_result[0][i]
            new_person_name = person_name[0] + "某" * (len(person_name) - 1)
            content = content.replace(person_name, new_person_name)

    return content
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值