身份证号码是一串特定的数字和字符组合,用于唯一标识一个人的身份信息。在进行数据处理或身份验证时,我们经常需要判断输入的字符串是否为有效的身份证号码。本文将使用Python编程语言,介绍如何判断一个字符串是否为身份证号码。
一、基本身份证号码格式
身份证号码的基本格式包括18位和15位两种。18位身份证号码由前17位数字和最后一位校验码组成,而15位身份证号码仅由15位数字组成。在对身份证号码进行判断时,我们首先要检查其基本格式是否正确。
import re
def is_valid_id_number(id_number):
if not isinstance(id_number, str):
return False
pattern = r"^\d{17}(\d|X|x)$"
if len(id_number) == 18:
return bool(re.match(pattern, id_number))
elif len(id_number) == 15:
pattern = r"^\d{15}$"
return bool(re.match(pattern, id_number))
else:
return False
上述代码中,我们利用正则表达式来匹配身份证号码的格式。首先判断输入是否为字符串类型,然后利用不同的正则表达式模式来匹配18位和15位身份证号码的格式。
二、身份证号码校验码
身份证号码的最后一位是校验码,用于验证前面17位数字的正确性。校验码的计算方法有特定规则,我们需要对身份证号码进行一系列计算,以确定校验码的正确性。
def get_check_digit(id_number):
coefficient_list = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
validate_char_list = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
check_sum = sum([int(id_number[i]) * coefficient_list[i] for i in range(17)])
check_digit_index = check_sum % 11
return validate_char_list[check_digit_index]
def is_valid_check_digit(id_number):
if len(id_number) != 18:
return False
return id_number[-1].upper() == get_check_digit(id_number[:-1]).upper()
上述代码中,我们首先定义了系数列表和校验字符列表,用于计算校验和和获取校验码。然后,通过对前17位数字和系数列表进行计算,得到校验和。最后,将校验和与身份证号码的最后一位进行比较,以验证校验码的正确性。
三、身份证号码地区和生日信息
身份证号码的前六位代表了所在地区的行政区划代码,接下来的八位代表了出生年月日。我们可以通过身份证号码提取出地区和生日信息,并进行进一步验证。
def extract_area(id_number):
area_dict = {
'11': '北京',
'12': '天津',
'13': '河北',
'14': '山西',
'15': '内蒙古',
# 更多省份...
}
area_code = id_number[:2]
return area_dict.get(area_code, '未知')
def extract_birthday(id_number):
if len(id_number) == 18:
birthday = id_number[6:14]
elif len(id_number) == 15:
birthday = '19' + id_number[6:12]
else:
return '未知'
year = birthday[:4]
month = birthday[4:6]
day = birthday[6:8]
return f'{year}年{month}月{day}日'
def is_valid_id_number(id_number):
if not isinstance(id_number, str):
return False
# 检查基本格式
pattern = r"^\d{17}(\d|X|x)$"
if len(id_number) == 18:
if not bool(re.match(pattern, id_number)):
return False
elif len(id_number) == 15:
pattern = r"^\d{15}$"
if not bool(re.match(pattern, id_number)):
return False
else:
return False
# 验证校验码
if len(id_number) == 18:
if not id_number[-1].upper() == get_check_digit(id_number[:-1]).upper():
return False
return True
上述代码中,我们利用字典将部分地区行政区划代码映射到对应的地区名称。然后,通过切片操作从身份证号码中提取出地区和生日信息,并进一步处理。最后,将处理结果返回。
四、判断是否为身份证号码
def is_id_number(id_number):
if is_valid_id_number(id_number):
area = extract_area(id_number)
birthday = extract_birthday(id_number)
return f'是有效的身份证号码,地区:{area},生日:{birthday}'
else:
return '不是有效的身份证号码'
上述代码中,我们调用前面编写的各个功能函数完成最终的判断。如果输入的字符串是有效的身份证号码,则同时返回地区和生日信息;否则返回不是有效的身份证号码。
至此,我们使用Python编程语言进行了身份证号码的判断。通过验证身份证号码的基本格式、校验码的正确性,以及提取和验证地区和生日信息,我们可以判断一个字符串是否为有效的身份证号码。
原创文章,作者:OYKM,如若转载,请注明出处:https://www.beidandianzhu.com/g/4038.html