一、验证:
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')