在Python中,我们可以通过简单的代码来验证身份证号码的合法性,同时也可以从中提取出身份证所属的地区信息。
一、验证身份证号码的合法性
身份证号码是一个18位的字符串,其中最后一位可能是数字或字母X,前17位是固定格式的数字。身份证号码的验证可以通过以下方法实现:
def verify_id_card(id_card: str) -> bool:
"""
验证身份证号是否有效
:param id_card: 身份证号
:return: bool,True表示有效,False表示无效
"""
# 正则表达式验证身份证基本格式
if not re.match(r'^d{17}(d|X)$', id_card):
return False
# 加权因子列表
weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
# 校验码列表
check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
# 计算校验码
total = sum([int(id_card[i]) * weight_factor[i] for i in range(17)])
remainder = total % 11
check_num = check_code[remainder]
# 最后一位为X时特殊处理
if id_card[-1] == 'X':
return check_num == 'X'
return check_num == id_card[-1]
其中,身份证号码的基本格式可以使用正则表达式进行验证。然后可以通过计算身份证号码的加权和,得到校验码,最后和身份证号码的最后一位进行比对,判断身份证号码的真伪。
二、提取身份证所属地区信息
在中国,身份证前6位代表所属地区的行政区划代码。以下是部分地区行政区划代码及其对应的名字:
REGION_CODE = {
'110000': '北京市',
'120000': '天津市',
'130000': '河北省',
'140000': '山西省',
'150000': '内蒙古自治区',
'210000': '辽宁省',
'220000': '吉林省',
'230000': '黑龙江省',
'310000': '上海市',
'320000': '江苏省',
'330000': '浙江省',
'340000': '安徽省',
'350000': '福建省',
'360000': '江西省',
'370000': '山东省',
'410000': '河南省',
'420000': '湖北省',
'430000': '湖南省',
'440000': '广东省',
'450000': '广西壮族自治区',
'460000': '海南省',
'500000': '重庆市',
'510000': '四川省',
'520000': '贵州省',
'530000': '云南省',
'540000': '西藏自治区',
'610000': '陕西省',
'620000': '甘肃省',
'630000': '青海省',
'640000': '宁夏回族自治区',
'650000': '新疆维吾尔自治区',
'710000': '台湾省',
'810000': '香港特别行政区',
'820000': '澳门特别行政区',
}
以下示例代码实现了根据身份证号码提取所属地区信息:
def get_region(id_card: str) -> str:
"""
从身份证号提取地区
:param id_card: 身份证号
:return: str,表示地区
"""
region_code = id_card[:6]
region = REGION_CODE.get(region_code)
return region if region else '未知'
三、完整示例代码
以下是将身份证号码合法性验证、提取所属地区信息和用户输入结合的完整示例代码:
import re
REGION_CODE = {
'110000': '北京市',
'120000': '天津市',
'130000': '河北省',
'140000': '山西省',
'150000': '内蒙古自治区',
'210000': '辽宁省',
'220000': '吉林省',
'230000': '黑龙江省',
'310000': '上海市',
'320000': '江苏省',
'330000': '浙江省',
'340000': '安徽省',
'350000': '福建省',
'360000': '江西省',
'370000': '山东省',
'410000': '河南省',
'420000': '湖北省',
'430000': '湖南省',
'440000': '广东省',
'450000': '广西壮族自治区',
'460000': '海南省',
'500000': '重庆市',
'510000': '四川省',
'520000': '贵州省',
'530000': '云南省',
'540000': '西藏自治区',
'610000': '陕西省',
'620000': '甘肃省',
'630000': '青海省',
'640000': '宁夏回族自治区',
'650000': '新疆维吾尔自治区',
'710000': '台湾省',
'810000': '香港特别行政区',
'820000': '澳门特别行政区',
}
def verify_id_card(id_card: str) -> bool:
"""
验证身份证号是否有效
:param id_card: 身份证号
:return: bool,True表示有效,False表示无效
"""
# 正则表达式验证身份证基本格式
if not re.match(r'^d{17}(d|X)$', id_card):
return False
# 加权因子列表
weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
# 校验码列表
check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
# 计算校验码
total = sum([int(id_card[i]) * weight_factor[i] for i in range(17)])
remainder = total % 11
check_num = check_code[remainder]
# 最后一位为X时特殊处理
if id_card[-1] == 'X':
return check_num == 'X'
return check_num == id_card[-1]
def get_region(id_card: str) -> str:
"""
从身份证号提取地区
:param id_card: 身份证号
:return: str,表示地区
"""
region_code = id_card[:6]
region = REGION_CODE.get(region_code)
return region if region else '未知'
def main():
id_card = input('请输入身份证号码:')
if verify_id_card(id_card):
region = get_region(id_card)
print(f'您输入的身份证所属地区为:{region}')
else:
print('您输入的身份证号码无效!')
if __name__ == '__main__':
main()