Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 397, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

Python 校验身份证及提取身份证中的有效信息

一、验证:

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')

posted on 2024-04-22 20:58 Benjamin 阅读(59) 评论(0)  编辑 收藏 引用 所属分类: python


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理