需要椒盐虾身份证号的正确性,大致了搜了下, 感觉用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"]