Python 實現判斷身份證號碼的有效性
阿新 • • 發佈:2018-11-30
import re def check_id_card(id_card): 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": "國外"} id_card = str(id_card) id_card = id_card.strip() # 刪除前後空格 id_card_list = list(id_card) # 地區校驗 if not area[id_card[0:2]]: print(errors[4]) # 15位身份號碼檢測 if len(id_card) == 15: if ((int(id_card[6:8]) + 1900) % 4 == 0 or ( (int(id_card[6:8]) + 1900) % 100 == 0 and (int(id_card[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, id_card): print(errors[0]) else: print(errors[2]) # 18位身份號碼檢測 elif len(id_card) == 18: # 出生日期的合法性檢查 if int(id_card[6:10]) % 4 == 0 or (int(id_card[6:10]) % 100 == 0 and int(id_card[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, id_card): # //計算校驗位 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的校驗位 print(errors[0]) else: print(errors[3]) else: print(errors[2]) else: print(errors[1]) if __name__ == "__main__": while True: input_card = input(u"請輸入你的身份證號:") if input_card == "exit": print(u"程式已結束!") break else: check_id_card(input_card)