身份证号正则验证与校验:原理剖析与实践指南

📅 2026/6/26 9:58:45
身份证号正则验证与校验:原理剖析与实践指南
身份证号正则验证与校验原理剖析与实践指南在处理用户数据时身份证号的验证与校验是一项常见的需求尤其是在涉及财务和安全验证的场景下。但你知道吗身份证号不仅仅是一个数字序列它还包含了出生日期、性别、行政区域等重要信息。如何准确地提取并验证这些信息是本文的核心内容。身份证号的结构解析中国的身份证号由18位数字组成包括17位数字本体码和1位数字校验码。具体结构如下1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── 校验码 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── 顺序码 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── 身份证号第15位 │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── 身份证号第14位 │ │ │ │ │ │ │ │ │ │ │ │ │ └── 身份证号第13位 │ │ │ │ │ │ │ │ │ │ │ │ └── 身份证号第12位 │ │ │ │ │ │ │ │ │ │ │ └── 身份证号第11位 │ │ │ │ │ │ │ │ │ │ └── 身份证号第10位 │ │ │ │ │ │ │ │ │ └── 身份证号第9位 │ │ │ │ │ │ │ │ └── 身份证号第8位 │ │ │ │ │ │ │ └── 身份证号第7位 │ │ │ │ │ │ └── 身份证号第6位 │ │ │ │ │ └── 身份证号第5位 │ │ │ │ └── 身份证号第4位 │ │ │ └── 身份证号第3位 │ │ └── 身份证号第2位 │ └── 身份证号第1位 └── 地址码前6位地址码前6位表示编码对象常住户口所在县市、旗、区的行政区划代码。出生日期码第7位至第14位表示编码对象出生的年、月、日格式为YYYYMMDD。顺序码第15位至第17位表示在同一地址码所标识的区域范围内对同年、同月、同日出生的人编定的顺序号。顺序码的奇数分配给男性偶数分配给女性。校验码第18位是通过一定的算法计算出来的用来校验身份证号的正确性。正则表达式验证正则表达式是验证身份证号的基本工具。通过正则表达式我们可以在输入时快速判断身份证号的格式是否正确。以下是一个常用的正则表达式用于验证18位身份证号的格式import re def validate_id_number(id_number): # 定义18位身份证号的正则表达式 pattern r^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X|x)$ # 使用re.match进行匹配 match re.match(pattern, id_number) # 如果匹配成功返回True if match: return True else: return False # 测试示例 print(validate_id_number(11010519491231002X)) # True print(validate_id_number(110105194912310021)) # False^[1-9]\d{5}表示地址码的前6位。第一个数字不能为0后面跟着5个数字。(18|19|20)\d{2}表示出生年份的前4位。年份必须是18、19或20开头后面跟着2个数字。(0[1-9]|1[0-2])表示出生月份。月份必须在01到12之间。(0[1-9]|[12]\d|3[01])表示出生日期。日期必须在01到31之间。\d{3}(\d|X|x)$表示顺序码和校验码。顺序码是3个数字校验码可以是数字或字母X不区分大小写。校验码的计算方法校验码的计算方法是根据前17位数字进行加权求和然后通过特定的算法计算出校验码。具体步骤如下定义加权因子每个数字位的加权因子分别为[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]。定义校验码对应值校验码的对应值分别为[1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2]。计算加权和将前17位数字与对应的加权因子相乘然后求和。计算模数将加权和对11取模。获取校验码根据模数在对应值中查找校验码。以下是一个Python示例展示了如何计算并验证校验码def calculate_checksum(id_number): # 定义加权因子 weights [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] # 定义校验码对应值 checksum_values [1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2] # 计算加权和 checksum sum(int(id_number[i]) * weights[i] for i in range(17)) # 计算模数 mod checksum % 11 # 获取校验码 expected_checksum checksum_values[mod] # 比较计算出的校验码与实际校验码 if id_number[17].upper() expected_checksum: return True else: return False # 测试示例 print(calculate_checksum(11010519491231002X)) # True print(calculate_checksum(110105194912310021)) # False综合验证与校验现在我们已经掌握了正则表达式验证和校验码计算的基本方法。为了确保身份证号的完整性和正确性我们可以将这两种方法结合起来进行综合验证与校验。以下是一个完整的Python示例def validate_and_calculate_checksum(id_number): # 定义18位身份证号的正则表达式 pattern r^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X|x)$ # 使用re.match进行匹配 match re.match(pattern, id_number) # 如果正则匹配失败返回False if not match: return False # 定义加权因子 weights [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] # 定义校验码对应值 checksum_values [1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2] # 计算加权和 checksum sum(int(id_number[i]) * weights[i] for i in range(17)) # 计算模数 mod checksum % 11 # 获取校验码 expected_checksum checksum_values[mod] # 比较计算出的校验码与实际校验码 if id_number[17].upper() expected_checksum: return True else: return False # 测试示例 print(validate_and_calculate_checksum(11010519491231002X)) # True print(validate_and_calculate_checksum(110105194912310021)) # False扩展验证行政区划码和出生日期除了格式和校验码我们还可以进一步验证行政区划码和出生日期的合法性。这需要额外的数据支持例如行政区划代码表和日期验证库。以下是一个扩展验证的示例import datetime def validate_address_code(address_code): # 假设有一个包含所有有效行政区划代码的列表 valid_address_codes [ 110105, 120106, 310101, # 仅为示例实际应用中应使用完整的代码表 # 更多代码... ] # 检查地址码是否在有效代码列表中 if address_code in valid_address_codes: return True else: return False def validate_birth_date(birth_date): try: # 尝试将出生日期字符串转换为日期对象 datetime.datetime.strptime(birth_date, %Y%m%d) return True except ValueError: return False def validate_id_number_extended(id_number): # 正则匹配 pattern r^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X|x)$ match re.match(pattern, id_number) if not match: return False # 提取地址码 address_code id_number[:6] # 提取出生日期码 birth_date id_number[6:14] # 验证地址码和出生日期 if not validate_address_code(address_code) or not validate_birth_date(birth_date): return False # 定义加权因子 weights [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] # 定义校验码对应值 checksum_values [1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2] # 计算加权和 checksum sum(int(id_number[i]) * weights[i] for i in range(17)) # 计算模数 mod checksum % 11 # 获取校验码 expected_checksum checksum_values[mod] # 比较计算出的校验码与实际校验码 if id_number[17].upper() expected_checksum: return True else: return False # 测试示例 print(validate_id_number_extended(11010519491231002X)) # True print(validate_id_number_extended(110105194912310021)) # False实战应用Web表单验证在实际开发中身份证号的验证通常用于Web表单。以下是一个使用Flask框架的示例展示了如何在Web表单中进行身份证号验证from flask import Flask, request, jsonify app Flask(__name__) def validate_id_number_extended(id_number): # 正则匹配 pattern r^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X|x)$ match re.match(pattern, id_number) if not match: return False # 提取地址码 address_code id_number[:6] # 提取出生日期码 birth_date id_number[6:14] # 验证地址码和出生日期 if not validate_address_code(address_code) or not validate_birth_date(birth_date): return False # 定义加权因子 weights [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] # 定义校验码对应值 checksum_values [1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2] # 计算加权和 checksum sum(int(id_number[i]) * weights[i] for i in range(17)) # 计算模数 mod checksum % 11 # 获取校验码 expected_checksum checksum_values[mod] # 比较计算出的校验码与实际校验码 if id_number[17].upper() expected_checksum: return True else: return False app.route(/validate_id_number, methods[POST]) def validate_id_number(): data request.json id_number data.get(id_number) if validate_id_number_extended(id_number): return jsonify({valid: True}) else: return jsonify({valid: False}) if __name__ __main__: app.run(debugTrue)总结与工具推荐通过本文你已经了解了身份证号的结构、正则表达式验证、校验码计算以及综合验证的方法。这些技术不仅在Web开发中非常有用也可以应用于其他需要身份证号验证的场景。如果你在开发过程中需要更多工具来辅助你的工作推荐使用 Hey Cron。Hey Cron 提供了一系列免费在线工具包括Cron 表达式生成器将中文描述的定时任务秒转为 Cron 表达式。正则表达式生成器帮助你生成和测试正则表达式。中英互译快速进行中英文翻译。JSON 格式化方便地格式化和验证 JSON 数据。Base64 编码解码轻松进行 Base64 编码和解码操作。时间戳转换将时间戳转换为可读的日期时间或反之。JWT 解析解析 JWT 令牌提取其中的有效信息。这些工具将大大提高你的开发效率希望它们能为你的项目带来便利。