文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一个简单的身份证校验

2023-01-30 23:05

关注

需要椒盐虾身份证号的正确性,大致了搜了下, 感觉用datetime校验时间比正则,就改了下

代码

  1 #!/usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3 # @Time    : 2018/12/18 9:11
  4 # @Author  : wys
  5 # @Site    : 身份证校验
  6 # @File    : id.py
  7 
  8 # -*- coding: utf-8 -*-
  9 import re
 10 from datetime import datetime
 11 
 12 
 13 def verify_birthday(birthday):
 14     if len(birthday) == 6:
 15         birthday = "19" + birthday
 16     try:
 17         datetime.strptime(birthday, "%Y%m%d")
 18         return True
 19 
 20     except Exception as e:
 21         return False
 22 
 23 
 24 def checkIdcard(idcard):
 25     """
 26     :param idcard:身份证号
 27 
 28     :return:
 29      成功 返回 省份、生日、性别
 30      失败 返回 失败结果与信息
 31     """
 32     ret = {"code": 0, "msg": ""}
 33 
 34     Errors = ['验证通过!', '身份证号码位数不对!', '身份证号码出生日期超出范围或含有非法字符!',
 35               '身份证号码校验错误!', '身份证地区非法!']
 36 
 37     area = {"11": "北京", "12": "天津", "13": "河北", "14": "山西", "15": "内蒙古", "21": "辽宁", "22": "吉林",
 38             "23": "黑龙江", "31": "上海", "32": "江苏", "33": "浙江", "34": "安徽", "35": "福建", "36": "江西",
 39             "37": "山东", "41": "河南", "42": "湖北", "43": "湖南", "44": "广东", "45": "广西", "46": "海南",
 40             "50": "重庆", "51": "四川", "52": "贵州", "53": "云南", "54": "西藏", "61": "陕西", "62": "甘肃",
 41             "63": "青海", "64": "宁夏", "65": "新疆", "71": "台湾", "81": "香港", "82": "澳门", "91": "国外"}
 42     idcard = str(idcard)
 43     idcard = idcard.strip()
 44     idcard_list = list(idcard)
 45 
 46     # 地区校验
 47     if not area[idcard[0:2]]:
 48         ret["msg"] = Errors[4]
 49         return ret
 50     """
 51     15位身份号码检测
 52     1-2位省、自治区、直辖市代码;
 53     3-4位地级市、盟、自治州代码;
 54     5-6位县、县级市、区代码;
 55     7-12位出生年月日,比如670401代表1967年4月1日,与18位的第一个区别;
 56     13-15位为顺序号,其中15位男为单数,女为双数;
 57 
 58     18位身份号码检测
 59     排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码,最后一位是数字校验码
 60     1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;
 61     2、将这17位数字和系数相乘的结果相加;
 62     3、用加出来和除以11,看余数是多少;
 63     4、余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2;
 64     5、通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的X。
 65 
 66     """
 67     if len(idcard) == 15:
 68         verify_re = re.compile('\d{15}$')
 69         if re.match(verify_re, idcard):
 70             if verify_birthday(idcard[6: 12]):
 71                 ret["code"] = 1
 72                 ret["msg"] = Errors[0]
 73             else:
 74                 ret["msg"] = Errors[2]
 75         else:
 76             ret["msg"] = Errors[2]
 77 
 78     elif len(idcard) == 18:
 79         verify_re = re.compile('\d{17}[0-9|X]$')
 80         if re.match(verify_re, idcard):
 81             if verify_birthday(idcard[6: 14]):
 82                 # //计算校验位
 83                 S = (int(idcard_list[0]) + int(idcard_list[10])) * 7 + \
 84                     (int(idcard_list[1]) + int(idcard_list[11])) * 9 + \
 85                     (int(idcard_list[2]) + int(idcard_list[12])) * 10 + \
 86                     (int(idcard_list[3]) + int(idcard_list[13])) * 5 + \
 87                     (int(idcard_list[4]) + int(idcard_list[14])) * 8 + \
 88                     (int(idcard_list[5]) + int(idcard_list[15])) * 4 + \
 89                     (int(idcard_list[6]) + int(idcard_list[16])) * 2 + \
 90                     int(idcard_list[7]) * 1 + \
 91                     int(idcard_list[8]) * 6 + \
 92                     int(idcard_list[9]) * 3
 93                 Y = S % 11
 94                 JYM = "10X98765432"
 95                 M = JYM[Y]  # 判断校验位
 96                 if M == idcard_list[17]:  # 检测ID的校验位
 97                     ret["code"] = 1
 98                     ret["msg"] = Errors[0]
 99                 else:
100                     ret["msg"] = Errors[3]
101             else:
102                 ret["msg"] = Errors[2]
103         else:
104             ret["msg"] = Errors[2]
105     else:
106         ret["msg"] = Errors[1]
107 
108     return ret
109 
110 
111 if __name__ == "__main__":
112     while True:
113         cdcard = raw_input(u"请输入你的身份证号:")
114         if cdcard == "exit":
115             print u"程序已结束!"
116             break
117         else:
118             print checkIdcard(cdcard)["msg"]

 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯