需要椒鹽蝦身份證號的正確性,大致了搜了下, 感覺用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"]