中国的居民身份证有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

原文:http://www.jb51.net/article/71793.htm

python身份证号码解析编程_Python实现身份证号码解析相关推荐

  1. python极客项目编程_Python极客项目编程 ([美]Mahesh Venkitachalam) 中文pdf完整版

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.通过Python编程,我们能够解决现实生活中的很多任务.Python极客项目编程通过14个有趣的项目,帮助和鼓励读者探索Python ...

  2. python语言支持函数式编程_python是函数式语言么

    函数式编程:functional,是一种编程范式. 函数式编程的特点:1. 把计算视为函数而非指令 2. 纯函数式编程:不需要变量,没有副作用,测试简单 3. 支持高阶函数,代码简洁 Python支持 ...

  3. python处理excel实例编程_python处理Excel的简单示例

    对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! Python中一般使用xlrd库来读取Excel文件,使用xlwt库来生成Excel文件,使用xl ...

  4. python六角形的绘制 编程_Python绘制六角形

    原博文 2020-03-11 14:43 − import turtleturtle.penup()turtle.fd(-100)turtle.pendown()turtle.pensize(10)t ...

  5. python 图形化socket编程_Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  6. python套接字编程_Python套接字编程(1)——socket模块与套接字编程

    在Python网络编程系列,我们主要学习以下内容: 5. 常见的Python异步编程框架 6. 协程在Python网络编程中的使用 本文介绍Python下的基本套接字编程,主要基于 socket 模块 ...

  7. python装饰器怎么编程_Python编程:Python装饰器入门

    Python允许你,作为程序员,使用函数完成一些很酷的事情.在Python编程学习中,函数是一等对象(first-class object),这就意味着你可以像使用字符串,整数,或者任何其他对象一样使 ...

  8. python是外部还是编程_Python网络编程(绑定到外部地址)

    我是python的新手,几天前我开始尝试网络编程(我在那里也是新手) 现在我发现了一个简洁的客户机-服务器程序,它在我的电脑上运行得非常简单,但是当我替换了本地地址,并告诉我的朋友运行客户机脚本时,它 ...

  9. python完全支持面向对象编程_python面向对象编程----009

    本篇内容: 1.反射 2.面向对象编程 3.面向对象三大特性 4.类成员 5.类成员修饰符 6.类的特殊成员 7.单例模式 反射 python中的反射功能是由以下四个内置函数提供:hasattr.ge ...

  10. python语言支持函数式编程_Python语言之Pyhton入门笔记函数式编程

    本文主要向大家介绍了Python语言之Pyhton入门笔记函数式编程,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 一,匿名函数 def add(x,y) return x+y ...

最新文章

  1. Spark Shuffle原理解析
  2. 【opencv】ubuntu14.04上编译opencv-4.0.1 + opencv_contrib-4.0.1
  3. 隐藏tabwidgt 用radiogroup来实现tab的切换
  4. 决策树c语言程序代码,R C5.0 决策树c50代码,名为 exit 1_r_开发99编程知识库
  5. Spring学习4之依赖注入(DI)
  6. 详细讲解Python字符串的各种内置方法
  7. ES6:Reflect
  8. Python 管道与特征联合
  9. Android WebView和JavaScript交互
  10. 吴恩达《机器学习》学习笔记七——逻辑回归(二分类)代码
  11. 数据提交到服务器后,在中间层所做的修改,能及时反应到客户端吗?
  12. 2020科目一考试口诀_科目一口诀顺口溜2020
  13. jq时间轴水平介绍js特效
  14. 【Windows】电脑蓝牙突然无法使用,解决办法来了
  15. 绝对神器,今天教你如何识别图片上竖排的日语文字
  16. 解决浏览器驱动和浏览器版本不匹配的报错:This version of ChromeDriver only supports Chrome version 97
  17. COSMOS认证辅导,原材料生产到成品分销的各个环节预防和安全原则的约束
  18. Tailwind Input
  19. 妙手回春,AI修复让老旧视频重焕新生
  20. pandas整表写入excel指定位置_Pandas学习笔记——读写Excel文件

热门文章

  1. pcs7组态虚拟机中的服务器,用虚拟机做PCS7时,无法设置固定的IP地址-工业支持中心-西门子中国...
  2. python-pygame作品之黑客帝国代码雨
  3. 使用wget下载KITTI数据集
  4. 《OpenDRIVE1.6规格文档》1
  5. cru使用教程_显示器刷新率超频教程
  6. 马云的B2B B2C 和C2C的“三合一”
  7. js读取excel,xlsx,xls 表格,转成JSON数据
  8. ERROR: librtmp not found 解决方案
  9. 服务器被攻击ip显示国外,服务器被不同的IP攻击怎么破?
  10. 线性同余法的伪随机数