Python實現身份證號碼有效性驗證

2022-08-16 11:33:10 字數 2837 閱讀 2371

# -*- coding: utf-8 -*-

import re

#errors=['驗證通過!','身份證號碼位數不對!','身份證號碼出生日期超出範圍或含有非法字元!','身份證號碼校驗錯誤!','身份證地區非法!']

def checkidcard(idcard):

errors=['驗證通過!','身份證號碼位數不對!','身份證號碼出生日期超出範圍或含有非法字元!','身份證號碼校驗錯誤!','身份證地區非法!']

area=

idcard=str(idcard)

idcard=idcard.strip()

idcard_list=list(idcard)

#地區校驗

if(not area[(idcard)[0:2]]):

print errors[4]

#15位身份號碼檢測

if(len(idcard)==15):

if((int(idcard[6:8])+1900) % 4 == 0 or((int(idcard[6:8])+1900) % 100 == 0 and (int(idcard[6:8])+1900) % 4 == 0 )):

erg=re.compile('[1-9][0-9][0-9]((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]$')#//測試出生日期的合法性

else:

ereg=re.compile('[1-9][0-9][0-9]((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]$')#//測試出生日期的合法性

if(re.match(ereg,idcard)):

print errors[0]

else:

print errors[2]

#18位身份號碼檢測

elif(len(idcard)==18):

#出生日期的合法性檢查

#閏年月日:((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]))

#平年月日:((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]))

if(int(idcard[6:10]) % 4 == 0 or (int(idcard[6:10]) % 100 == 0 and int(idcard[6:10])%4 == 0 )):

ereg=re.compile('[1-9][0-9](19[0-9]|20[0-9])((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][0-9xx]$')#//閏年出生日期的合法性正規表示式

else:

ereg=re.compile('[1-9][0-9](19[0-9]|20[0-9])((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][0-9xx]$')#//平年出生日期的合法性正規表示式

#//測試出生日期的合法性

if(re.match(ereg,idcard)):

#//計算校驗位

s = (int(idcard_list[0]) + int(idcard_list[10])) * 7 + (int(idcard_list[1]) + int(idcard_list[11])) * 9 + (int(idcard_list[2]) + int(idcard_list[12])) * 10 + (int(idcard_list[3]) + int(idcard_list[13])) * 5 + (int(idcard_list[4]) + int(idcard_list[14])) * 8 + (int(idcard_list[5]) + int(idcard_list[15])) * 4 + (int(idcard_list[6]) + int(idcard_list[16])) * 2 + int(idcard_list[7]) * 1 + int(idcard_list[8]) * 6 + int(idcard_list[9]) * 3

y = s % 11

m = "f"

jym = "10x98765432"

m = jym[y]#判斷校驗位

if(m == idcard_list[17]):#檢測id的校驗位

print errors[0]

else:

print errors[3]

else:

print errors[2]

else:

print errors[1]

if __name__ == "__main__":

while true:

cdcard = raw_input(u"請輸入你的身份證號:")

if cdcard == "exit":

print u"程式已結束!"

break

else:

checkidcard(cdcard)

java實現 身份證號碼驗證

號碼的結構 公民身份號碼是特徵組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次為 六位數字位址碼 八位數字出生日期碼 三位數字順序碼 和一位數字校驗碼 校驗碼的計算 1 十七位數字本體碼 加權求和公式 s sum ai wi i 0,16 先對前 17 位數字的權求和 ai 表示第 ...

身份證號碼

每乙個人自出生後都會有乙個身份證號碼。根據我國有關部門規定,公民身份號碼是特徵組合碼,由十七位數字本體碼和一位數字校驗碼組成。排列順序從左至右依次為 六位數字位址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。居民身份證是國家法定的證明公民個人身份的有效證件。例如 對於身份證號碼330719...

身份證號碼驗證

說明 驗證身份證的有效性 引數 cid 身份證號碼 返回 地方 出生時間 性別 private string checkcidinfo string cid if cid.length 18 char c cid cid.length 1 bool last false if c 0 c 9 c a...