基于python身份证校验及信息提取
时间: 2023-12-21 14:06:26 浏览: 76
身份证号码共18位,其中前17位为地区和出生年月日信息,最后一位为校验码。以下是基于python实现的身份证校验和信息提取代码:
```python
import re
def check_idcard(idcard):
"""
身份证校验函数
"""
# 校验身份证号码格式
if not re.match(r'^\d{17}(\d|X|x)$', idcard):
return False
# 校验身份证号码的前17位是否合法
province_code = idcard[:2]
if province_code not in PROVINCE_CODE:
return False
birth_year = int(idcard[6:10])
birth_month = int(idcard[10:12])
birth_day = int(idcard[12:14])
if not is_valid_date(birth_year, birth_month, birth_day):
return False
# 校验身份证号码的最后一位是否正确
weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_code = '10X98765432'[sum([int(idcard[i]) * weights[i] for i in range(17)]) % 11]
if check_code != idcard[-1].upper():
return False
return True
def get_idcard_info(idcard):
"""
身份证信息提取函数
"""
province_code = idcard[:2]
province = PROVINCE_DICT.get(province_code, '')
birth_year = int(idcard[6:10])
birth_month = int(idcard[10:12])
birth_day = int(idcard[12:14])
sex = '女' if int(idcard[-2]) % 2 == 0 else '男'
return {
'province': province,
'birth_year': birth_year,
'birth_month': birth_month,
'birth_day': birth_day,
'sex': sex
}
def is_valid_date(year, month, day):
"""
判断日期是否合法
"""
if month < 1 or month > 12:
return False
if day < 1 or day > 31:
return False
if month in [4, 6, 9, 11] and day > 30:
return False
if month == 2:
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
if day > 29:
return False
else:
if day > 28:
return False
return True
# 省份代码和名称映射
PROVINCE_DICT = {
'11': '北京市',
'12': '天津市',
'13': '河北省',
'14': '山西省',
'15': '内蒙古自治区',
'21': '辽宁省',
'22': '吉林省',
'23': '黑龙江省',
'31': '上海市',
'32': '江苏省',
'33': '浙江省',
'34': '安徽省',
'35': '福建省',
'36': '江西省',
'37': '山东省',
'41': '河南省',
'42': '湖北省',
'43': '湖南省',
'44': '广东省',
'45': '广西壮族自治区',
'46': '海南省',
'50': '重庆市',
'51': '四川省',
'52': '贵州省',
'53': '云南省',
'54': '西藏自治区',
'61': '陕西省',
'62': '甘肃省',
'63': '青海省',
'64': '宁夏回族自治区',
'65': '新疆维吾尔自治区',
'71': '台湾省',
'81': '香港特别行政区',
'82': '澳门特别行政区'
}
# 省份代码列表
PROVINCE_CODE = list(PROVINCE_DICT.keys())
```
使用示例:
```python
idcard = '11010119900307401X'
if check_idcard(idcard):
idcard_info = get_idcard_info(idcard)
print(idcard_info)
else:
print('身份证号码不合法')
```
输出结果:
```
{'province': '北京市', 'birth_year': 1990, 'birth_month': 3, 'birth_day': 7, 'sex': '男'}
```