在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()
原創文章,作者:KFZLH,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/373310.html