中国的居民身份证有18位。其中前17位是信息码,最后1位是校验码。每位信息码可以是0-9的数字,而校验码可以是0-9或X,其中X表示10。

身份证校验码算法:

设18位身份证号序列从左到右为:

引用

a[0], a[1], a[2], a[3], ..., a[16], a[17]

其中a[i]表示第i位数字,i=0,1,2,...,17,如果最后一位(校验位)是X,则a[17]=10

每一位被赋予一个“权值”,其中,第i位的权值w[i]的计算方法是:

引用

w[i] = 2**(17-i) % 11

其中,i=0,1,2,3,...,17,运算符按Python惯例:x**y表示x的y次方,x%y表示x除以y的余数。

如果一个身份证号是正确的,那么:

引用

(a[0]*w[0] + a[1]*w[1] + a[2]*w[2] + ... + a[16]*w[16] + a[17]*w[17]) % 11 == 1

实际上,校验位a[17]的计算方法,就是巧妙地选择一个值使得上式成立。

根据上述算法,下面是一个验证身份证号正确性的程序。

初学者————代码没有什么依照编写规范,流水账的模式。还有两个功能没有实现:

1、依照身份证号码的区域代码解析所在区域;

2、将身份证校验码的校验作为前置判断,如果错误就不再解析其他内容,汗,我还不会;

ID=input('请输入十八位身份证号码: ')

if len(ID)==18:

print("你的身份证号码是 "+ID)

else:

print("错误的身份证号码")

ID_add=ID[0:6]

ID_birth=ID[6:14]

ID_sex=ID[14:17]

ID_check=ID[17]

#ID_add是身份证中的区域代码,如果有一个行政区划代码字典,就可以用获取大致地址#

year=ID_birth[0:4]

moon=ID_birth[4:6]

day=ID_birth[6:8]

print("生日: "+year+'年'+moon+'月'+day+'日')

if int(ID_sex)%2==0:

print('性别:女')

else:

print('性别:男')

#此部分应为错误判断,如果错误就不应有上面的输出,如何实现?#

W=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]

ID_num=[18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2]

ID_CHECK=['1','0','X','9','8','7','6','5','4','3','2']

ID_aXw=0

for i in range(len(W)):

ID_aXw=ID_aXw+int(ID[i])*W[i]

ID_Check=ID_aXw%11

if ID_check==ID_CHECK[ID_Check]:

print('正确的身份证号码')

else:

print('错误的身份证号码')

我们再来看一个更加完善些的示例

import re

#Errors=['验证通过!','身份证号码位数不对!','身份证号码出生日期超出范围或含有非法字符!','身份证号码校验错误!','身份证地区非法!']

def checkIdcard(idcard):

Errors=['验证通过!','身份证号码位数不对!','身份证号码出生日期超出范围或含有非法字符!','身份证号码校验错误!','身份证地区非法!']

area={"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":"国外"}

idcard=str(idcard)

idcard=idcard.strip()

idcard_list=list(idcard)

#地区校验

if(not area[(idcard)[0:2]]):

print Errors[4]

#15位身份号码检测

if(len(idcard)==15):

if((int(idcard[6:8])+1900) % 4 == 0 or((int(idcard[6:8])+1900) % 100 == 0 and (int(idcard[6:8])+1900) % 4 == 0 )):

erg=re.compile('[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$')#//测试出生日期的合法性

else:

ereg=re.compile('[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$')#//测试出生日期的合法性

if(re.match(ereg,idcard)):

print Errors[0]

else:

print Errors[2]

#18位身份号码检测

elif(len(idcard)==18):

#出生日期的合法性检查

#闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))

#平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))

if(int(idcard[6:10]) % 4 == 0 or (int(idcard[6:10]) % 100 == 0 and int(idcard[6:10])%4 == 0 )):

ereg=re.compile('[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$')#//闰年出生日期的合法性正则表达式

else:

ereg=re.compile('[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$')#//平年出生日期的合法性正则表达式

#//测试出生日期的合法性

if(re.match(ereg,idcard)):

#//计算校验位

S = (int(idcard_list[0]) + int(idcard_list[10])) * 7 + (int(idcard_list[1]) + int(idcard_list[11])) * 9 + (int(idcard_list[2]) + int(idcard_list[12])) * 10 + (int(idcard_list[3]) + int(idcard_list[13])) * 5 + (int(idcard_list[4]) + int(idcard_list[14])) * 8 + (int(idcard_list[5]) + int(idcard_list[15])) * 4 + (int(idcard_list[6]) + int(idcard_list[16])) * 2 + int(idcard_list[7]) * 1 + int(idcard_list[8]) * 6 + int(idcard_list[9]) * 3

Y = S % 11

M = "F"

JYM = "10X98765432"

M = JYM[Y]#判断校验位

if(M == idcard_list[17]):#检测ID的校验位

print Errors[0]

else:

print Errors[3]

else:

print Errors[2]

else:

print Errors[1]

可以通过命令行输入。第一个命令行参数是身份证号。输出Valid或Invalid。

#!/usr/bin/env python

# -*- coding: utf-8 -*-

USAGE="""\

USAGE: python shenfenzheng.py shenfenzhenghao

"""

chmap = {

'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,

'x':10,'X':10

}

def ch_to_num(ch):

return chmap[ch]

def verify_string(s):

char_list = list(s)

num_list = [ch_to_num(ch) for ch in char_list]

return verify_list(num_list)

def verify_list(l):

sum = 0

for ii,n in enumerate(l):

i = 18-ii

weight = 2**(i-1) % 11

sum = (sum + n*weight) % 11

# print "i=%d,weight=%d,n=%d,sum=%d"%(i,weight,n,sum)

# print sum

return sum==1

if __name__=='__main__':

import sys

if len(sys.argv)!=2:

print USAGE

sys.exit(1)

result = verify_string(sys.argv[1])

if result:

print "Valid"

else:

print "Invalid"

命令行使用举例:

引用

$ python shenfenzheng.py 320105198209275127

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

python读取身份证号_Python实现身份证号码解析相关推荐

  1. python读取身份证照片信息_python验证身份证信息实例代码

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

  2. 证件类型为身份证号时进行身份证校验

    需求:代办人身份证号改为代办人证件类型(默认为身份证号),后面跟着号码,房主和代办人的证件类型为身份证号时进行身份证校验 效果: sf_ghgl_add.jsp <td class=" ...

  3. 使用js验证身份证号格式以及身份证号中的生日验证

    由于不管是测试项目练手还是实际项目开发,都应该考虑数据的严密性和软件的通俗易懂的实用性,下面是我用js实现的验证身份证号格式以及身份证号中的生日验证代码 //生日移出点击事件验证身份证号中的生日验证 ...

  4. 判断身份证号,根据身份证号自动生成出生日期

    判断身份证号,根据身份证号自动生成出生日期 idCodeValid(rule, value, callback) => {let reg = /(^[1-9]\d{5}(18|19|([23]\ ...

  5. python定义公民类、变量有身份证号_Python趣解身份证号码的奥秘!

    原标题:Python趣解身份证号码的奥秘! 问题描述 作为一个公民,每个人都有一张独一无二的身份证,有独一无二的身份证号码.在这里面几乎储存了我们所有的行踪与信息,所以有很多不法分子能够仅通过身份证号 ...

  6. oracle 导出身份证号_ORACLE对身份证号码处理相关的SQL【收藏】

    /*ORACLE对身份证号码处理相关的SQL汇总 身份证号码算法及应用场景: 工作实践总结,与大家分享快乐,并请高人批评指正,努力改进: 目前我国大量存在着正在有效期的15位身份证,虽然国家在推行二代 ...

  7. oracle 导出身份证号_ORACLE对身份证号码处理相关的SQL汇总

    目前我国大量存在着正在有效期的15位身份证,虽然国家在推行二代身份证,但尚未发现强行要求全国人民更换未到期的15位身份证的官方声明或公告. 扯远了:),总之合法的15位身份证号码将在今后一段时间内继续 ...

  8. js实现完美身份证号有效性验证+身份证与姓名匹配

    /* 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位 ...

  9. python读取grib2数据_python读取grib grib2气象数据

    GRIB是WMO开发的一种用于交换和存储规则分布数据的二进制文件格式,主要用来表示数值天气预报的产品资料.现行的GRIB 码版本有GRIB1 和GRIB2 两种格式.由于小编只接触过GRIB1数据,所 ...

最新文章

  1. 28、FileThumbnails
  2. php ftp 大文件,php – 将文件复制到服务器与FTP之间的文件大小差异
  3. 豪鹫闲谈--什么因素影响了我们的工资
  4. java多线程之hashmap concurrenthashmap的状态同步
  5. [html] 请实现一个文章阅读的进度条
  6. 和朋友们一起探道一下CPA广告反作弊方面的技术,欢迎大家发表意见。
  7. redis和memcache的对比
  8. 直接内存访问 (Direct Memory Access, DMA)
  9. BadgerDAO锁仓量超过9亿美元
  10. mysql的dockerfile_dockerfile构建mysql镜像
  11. SQL语句group by 与order by 执行顺序引发的一场“内斗”
  12. win10中安装step7 5.6
  13. 谷歌地图动画_Google地图上的动画路线
  14. Ubuntu修改Mac地址
  15. 统计学——卡方检验和卡方分布
  16. CentOS 7 安装rar解压rar
  17. 惊悚游戏《寂静岭》厕所3D场景模型制作分享
  18. 一次控制文件control file sequential read 等待性能案例分析
  19. 线程操作:冻结与解冻线程
  20. 详解python单例模式

热门文章

  1. 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★
  2. lsmod ‘used by‘ 的值是 -1
  3. 视相关细节层次网格简化方法(VDPM-LOD)
  4. 通过心理学知识提高问题定位与解决能力(下)
  5. 《移动游戏开发精要》读书笔记
  6. C语言基础入门48篇_18_使用循环移动游戏人物(屏幕符号运动、while(1){}进行实时响应,if(表达式){},switch(表达式){},windows的API及API进行自行封装使)
  7. 微信小程序(组件开发)
  8. 【VScode报错】> ools-1.1.3\debugAdapters\bin\WindowsDebugLa‘--stdout=Microsoft-MIEngine-Out-aguzdga1-npu
  9. c语言中的0、‘0’、‘\0’、“0”及NULL
  10. 神奇的算法(一):欧几里德算法