python 校验身份证号码 并输出对应省市县生日 demo

1.需求

2.代码实现

 
# _*_coding:utf-8_*_
import re
def validateIdCard(idCard):
    weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    sum = 0
    for i in range(len(idCard)):
        sum += int(idCard[i]) * weight[i]
    return check_code[sum % 11]
def passIdCard(idCard):
    idCardRegParttern = re.compile('^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$')
    res = re.match(idCardRegParttern, idCard)
    return res != None

def findArea(areaCode):
    # 1. 获取区域情况
    areaList = []
    with open('./area.js', 'rb') as file:
        temp = file.readline()
        while temp:
            areaList.append(temp.decode('utf-8'))
            temp = file.readline()
    # 2. 找地区
    provinceCode = areaCode[0:2]+"0000"
    cityCode = areaCode[0:4]+"00"
    provinceVal = ''
    cityVal = ''
    areaVal = ''
    for item in areaList:
        if item.startswith(provinceCode):
            provinceVal = item.split(",")[1].strip("\n").strip("\r")
        if item.startswith(cityCode):
            cityVal = item.split(",")[1].strip("\n").strip("\r")+'市'
        if item.startswith(areaCode):
            areaVal = item.split(",")[1].strip("\n").strip("\r")
    
    return provinceVal+cityVal+areaVal

def judge(idCard):
    if (validateIdCard(idCard[:17]) == idCard[17]):
        print('校验通过!')
    else:
        print('校验失败!')
        return
    if int(idCard[16]) % 2 == 0:
        print('性别:女')
    else:
        print('性别:男')
    print('生日:{}年{}月{}日'.format(idCard[6:10], idCard[10:12], idCard[12:14]))
    print('籍贯:{}'.format(findArea(idCard[0:6])))

def main():
    # idCard = "230182198012251659"
    # if passIdCard(idCard) == False:
    #     print("fail")
    # else:
    #     judge(idCard)
    while True:
        idCard = input('请输入身份证号码:')
        if passIdCard(idCard) == False:
            print("校验失败!")
        else:
            judge(idCard)

if __name__ == '__main__':
    main()

注:省市文件较大,放百度云了

链接:百度网盘 请输入提取码
提取码:xe9i

3.实现效果

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东芃9394

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值