Python实现身份证号码校验
以下是Python实现符合中国身份证要求的身份证号码校验的代码演示。我们使用正则表达式来验证身份证号码的格式是否正确,然后再进行一些其他的校验。
import re def validate_id_number(id_number): """ 验证身份证号码是否合法 Args: id_number (str): 待验证的身份证号码 Returns: bool: 是否合法 """ # 验证身份证号码格式是否正确 pattern = r'^\d{17}[\dXx]$' if not re.match(pattern, id_number): return False # 验证身份证号码中的地区码是否正确 province_code = id_number[:2] if province_code not in area_codes: return False # 验证身份证号码中的出生日期是否正确 birthday = id_number[6:14] try: datetime.datetime.strptime(birthday, '%Y%m%d') except ValueError: return False # 验证身份证号码中的校验码是否正确 factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] check_code_map = { 0: '1', 1: '0', 2: 'X', 3: '9', 4: '8', 5: '7', 6: '6', 7: '5', 8: '4', 9: '3', 10: '2' } check_sum = sum(int(id_number[i]) * factors[i] for i in range(17)) check_code = check_code_map[check_sum % 11] if check_code != id_number[-1].upper(): return False # 身份证号码验证通过 return True # 区域码表,根据具体情况进行修改 area_codes = { '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', '91' } # 测试 id_numbers = ['110101199003075193', '310101199003075193', '430101199003075193', '320101199003075193', '500101199003075193', '120101199003075193', '999999999999999999'] for id_number in id_numbers: if validate_id_number(id_number): print(f'{id_number} 是合法的身份证号码') else: print(f'{id_number} 不是合法的身份证号码')
在这个代码演示中,我们首先定义了一个 validate_id_number 函数,用于验证身份证号码是否合法。该函数接收一个待验证身份证号码作为参数,返回一个布尔值,表示该身份证号码是否合法。
在函数实现中,我们使用了正则表达式来验证身份证号码的格式是否正确,首先要求身份证号码必须为 18 位数字或字母 X(最后一位可能是 X 或 x)。
接下来,我们从身份证号码中提取出地区码、出生日期和校验码,并进行验证。具体来说:
验证地区码:根据身份证号码的第 1 到 2 位来判断地区码是否正确,我们在代码中使用一个名为 area_codes 的集合来存储有效的地区码列表。如果待验证的身份证号码的地区码不在该列表中,则视为不合法。
验证出生日期:身份证号码的第 7 到 14 位是出生日期,格式为 8 位数字。我们可以使用 Python 的 datetime.datetime.strptime 函数将其解析为日期格式,如果出现解析错误,则说明出生日期不合法。
验证校验码:身份证号码的最后一位是校验码,我们需要使用一定的算法来计算出该校验码,然后与身份证号码中的校验码进行比对。具体来说,我们可以使用一个名为 factors 的列表来存储 17 个加权因子,然后将身份证号码中的前 17 位数字与这些因子相乘并求和,得到一个数值。然后将该数值除以 11 取余数,用余数值查找校验码映射表 check_code_map 中对应的校验码。如果该校验码与身份证号码中的校验码不相同,则视为不合法。
最后,我们在代码中使用了一些测试数据对函数进行了测试。对于每个测试数据,我们调用 validate_id_number 函数来判断其是否合法,并输出相应的结果。
相关文章