一、驗證:
1. 校驗身份證長度:身份證號碼一般為18位,其中最后一位可能是字母X(用于表示10),其他17位為數字。
2. 校驗身份證前17位是否為數字:可以使用正則表達式進行匹配,判斷前17位是否全部為數字。
3. 校驗身份證的地區碼:身份證的前6位是地區碼,可以通過查詢相關地區碼表進行校驗。
4. 校驗身份證的出生日期:身份證的第7位到第14位是出生日期,根據年份、月份和日期進行簡單的校驗,判斷是否符合日期規則。
5. 校驗身份證的最后一位校驗碼:身份證的最后一位是校驗碼,用于校驗前17位是否合法。校驗碼的計算方法是通過前17位的權重和校驗碼進行計算,計算公式如下:
將身份證前17位的每一位乘以對應的權重值(分別為7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2);
將得到的結果相加,并對11取模得到一個余數;將這個余數與校驗碼進行比較,如果相等,則身份證號碼合法
二、提取信息
1. 提取性別信息:身份證的倒數第二位是性別標識,奇數代表男性,偶數代表女性。
2. 提取出生日期:身份證的第7位到第14位是出生日期,可以直接提取出來。
3. 提取地區信息:身份證的前6位是地區碼,可以通過查詢相關地區碼表獲取對應的地區信息。
三、python代碼
1 import re
2 def validate_id_card(id_card):
3 # 校驗身份證長度
4 if len(id_card) != 18:
5 return False
6 # 校驗身份證前17位是否為數字
7 if not re.match(r'^\d{17}(\d|X|x)$', id_card):
8 return False
9 # 校驗身份證地區碼
10 area_code = id_card[:6]
11 # TODO: 根據地區碼表進行校驗
12 # 校驗身份證出生日期
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: 根據年份、月份和日期進行校驗
18 # 校驗身份證最后一位校驗碼
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: 根據地區碼表獲取地區信息
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'地區碼:{info["area_code"]}')
48 else:
49 print('身份證號碼不合法\n')