验证身份证信息(python)

identity-card

       验证身份证号码的正确性,不能仅仅通过正则表达式来验证,我们都知道我国的身份证一共是18位,由十七位数字本体码和一位校验码组成。
其排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。

  1. 地址码 (身份证号码前六位);表示编码对象常住户口所在县(市、旗、区)的行政区域划分代码,按GB/T2260的规定执行。1-2位省、自治区、直辖市代码; 3-4位地级市、盟、自治州代码; 5-6位县、县级市、区代码。
  2. 出生日期码 (身份证号码第七位到第十四位);表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
  3. 顺序码 (身份证号码第十五位到十七位);表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
  4. 校验码(身份证号码最后一位);是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,X是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。
校验码计算步骤
  • 十七位数字本体码加权求和公式

       S = Sum(Ai * Wi), i = 0, … , 16 ,先对前17位数字的权求和

       Ai:表示第i位置上的身份证号码数字值(0~9)

       Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (表示第i位置上的加权因子)

  • 计算模

       Y = mod(S, 11)

  • 根据模,查找得到对应的校验码

       Y: 0 1 2 3 4 5 6 7 8 9 10

       校验码: 1 0 X 9 8 7 6 5 4 3 2

对应的代码校验如下:

  • Java
public class IdentityCard{
   
   
    int[] weight={
   
   7,9,10,5,8,4
### 如何使用Python验证中国身份证号码的有效性 为了确保身份证号码的有效性,不仅需要检查校验码是否正确,还需要确认其他几个方面: - 身份证号码总长度应为18位; - 地址编码需遵循中国的行政区划代码规定; - 出生日期部分应当表示一个实际存在的日期。 #### 方法一:利用第三方库`id-validator` 安装此库可以通过pip命令完成: ```bash pip install id-validator ``` 之后,在程序里导入并调用相应的函数来检验给定的字符串是不是有效的身份证号[^1]: ```python from id_validator import validator def check_id_validity(id_number): result = validator.is_valid(id_number) return "有效" if result else "无效" ``` 这种方法简单快捷,适合不想深入了解具体逻辑的应用场景。 #### 方法二:手动实现校验过程 对于想要理解内部机制的情况,则可以根据国家标准GB11643-1999自行编写代码来进行更详细的验证。下面是一个简单的例子,它会依次检查输入的身份证明编号的各项属性,并最终给出结论。 ```python import re from datetime import date def validate_id_card(id_num): # 初步格式检测 pattern = r'^(\d{6})(\d{4})(\d{2})(\d{2})((?:\d|X|x){1})(\d{2}|\d)$' match_obj = re.match(pattern, id_num) if not match_obj or len(id_num) != 18: return '长度错误' addr_code, year_str, month_str, day_str, checksum_char, _ = match_obj.groups() try: birth_date = date(int(year_str), int(month_str), int(day_str)) except ValueError as e: return str(e).replace('is out of range', '超出范围') weights = (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2) valid_checksum_chars = ('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2') sum_of_products = sum([int(a)*b for a,b in zip(list(addr_code + year_str + month_str + day_str + checksum_char[:-1]), weights)]) mod_result = sum_of_products % 11 expected_checksum_char = valid_checksum_chars[mod_result] if checksum_char.upper() != expected_checksum_char: return f'校验码错误,应该是 {expected_checksum_char}' return '校验码正确' if __name__ == '__main__': test_ids = ['11010519491231002X'] results = [validate_id_card(i) for i in test_ids] print(results) ``` 这段脚本首先定义了一个正则表达式模式用于匹配标准形式的身份证明编号;接着提取出生年月日信息尝试创建一个新的`date`对象以测试这些数值是否合理;最后根据官方提供的加权求和取模法计算预期得到的校验字符并与原始数据对比得出结果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值