一、驗(yàn)證:
1. 校驗(yàn)身份證長度:身份證號碼一般為18位,其中最后一位可能是字母X(用于表示10),其他17位為數(shù)字。
2. 校驗(yàn)身份證前17位是否為數(shù)字:可以使用正則表達(dá)式進(jìn)行匹配,判斷前17位是否全部為數(shù)字。
3. 校驗(yàn)身份證的地區(qū)碼:身份證的前6位是地區(qū)碼,可以通過查詢相關(guān)地區(qū)碼表進(jìn)行校驗(yàn)。
4. 校驗(yàn)身份證的出生日期:身份證的第7位到第14位是出生日期,根據(jù)年份、月份和日期進(jìn)行簡單的校驗(yàn),判斷是否符合日期規(guī)則。
5. 校驗(yàn)身份證的最后一位校驗(yàn)碼:身份證的最后一位是校驗(yàn)碼,用于校驗(yàn)前17位是否合法。校驗(yàn)碼的計(jì)算方法是通過前17位的權(quán)重和校驗(yàn)碼進(jìn)行計(jì)算,計(jì)算公式如下:
將身份證前17位的每一位乘以對應(yīng)的權(quán)重值(分別為7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2);
將得到的結(jié)果相加,并對11取模得到一個余數(shù);將這個余數(shù)與校驗(yàn)碼進(jìn)行比較,如果相等,則身份證號碼合法
二、提取信息
1. 提取性別信息:身份證的倒數(shù)第二位是性別標(biāo)識,奇數(shù)代表男性,偶數(shù)代表女性。
2. 提取出生日期:身份證的第7位到第14位是出生日期,可以直接提取出來。
3. 提取地區(qū)信息:身份證的前6位是地區(qū)碼,可以通過查詢相關(guān)地區(qū)碼表獲取對應(yīng)的地區(qū)信息。
三、python代碼
1 import re
2 def validate_id_card(id_card):
3 # 校驗(yàn)身份證長度
4 if len(id_card) != 18:
5 return False
6 # 校驗(yàn)身份證前17位是否為數(shù)字
7 if not re.match(r'^\d{17}(\d|X|x)$', id_card):
8 return False
9 # 校驗(yàn)身份證地區(qū)碼
10 area_code = id_card[:6]
11 # TODO: 根據(jù)地區(qū)碼表進(jìn)行校驗(yàn)
12 # 校驗(yàn)身份證出生日期
13 birth_date = id_card[6:14]
14 year = int(birth_date[:4])
15 month = int(birth_date[4:6])
16 day = int(birth_date[6:])
17 # TODO: 根據(jù)年份、月份和日期進(jìn)行校驗(yàn)
18 # 校驗(yàn)身份證最后一位校驗(yàn)碼
19 check_code = id_card[-1].upper()
20 weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
21 check_sum = sum(int(id_card[i]) * weights[i] for i in range(17)) % 11
22 check_codes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
23 if check_code != check_codes[check_sum]:
24 return False
25 return True
26 def extract_id_card_info(id_card):
27 gender_code = int(id_card[-2])
28 gender = '男' if gender_code % 2 == 1 else '女'
29 birth_date = id_card[6:14]
30 year = birth_date[:4]
31 month = birth_date[4:6]
32 day = birth_date[6:]
33 area_code = id_card[:6]
34 # TODO: 根據(jù)地區(qū)碼表獲取地區(qū)信息
35 return {
36 'gender': gender,
37 'birth_date': f'{year}-{month}-{day}',
38 'area_code': area_code
39 }
40 if __name__ == '__main__':
41 while True:
42 id_card = input("請輸入身份證號:")
43 if validate_id_card(id_card):
44 info = extract_id_card_info(id_card)
45 print(f'性別:{info["gender"]}')
46 print(f'出生日期:{info["birth_date"]}')
47 print(f'地區(qū)碼:{info["area_code"]}')
48 else:
49 print('身份證號碼不合法\n')