Python 實現判斷身份證號碼的有效性

2021-09-02 05:38:47 字數 2793 閱讀 4235

import re

def check_id_card(id_card):

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

area =

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][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:

e_reg = 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(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](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:

e_reg = 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(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)

身份證號碼

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

身份證號碼檢測

華為的上機題 我國公民的身份證號碼特點如下 1 長度為18位 2 第1 17位只能為數字 3 第18位可以是數字或者小寫英文本母x。4 身份證號碼的第7 14位表示持有人生日的年 月 日資訊。例如 511002 19880808 0111或511002 19880808011x。請實現身份證號碼合法...