python身份证号码共18位_Python实现身份证号码解析
中国的居民身份证有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
本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉
本文系统来源:php中文网
python身份证号码共18位_Python实现身份证号码解析相关推荐
- python身份证号码共18位_18位身份证校验
数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9]*)$ 非零开头的最多带两位小 ...
- 身份证号码是18位数字字符构成的字符串,输入一个身份证号码判断该号码拥有者的性别
/*身份证号码是18位数字字符构成的字符串,输入一个身份证号码判断该号码拥有者的性别 提示:第17为数字字符奇数为男,偶数为女 */ #include #include #include #inclu ...
- Excel如何快速将15位身份证号码转为18位
今天跟大家分享一下Excel如何快速将15位身份证号码转为18位 1.首先我们选中身份证号码单元格区域 2.点击[DIY工具箱] 3.点击[身份证]选择[15位身份证证升18位] 4.点击[确定] ...
- 身份证号第18位(效验码)计算方法 用于检测身份证号是否正确
前言: 由于在某些时候,可能需要用户输入真实的身份证号,但是用户可能会胡乱输入虚假的身份证号,导致信息的不真实性,所以为了防止用户胡乱输入,可以通过一些小方法来检测身份证号是否输入正确,本文将介绍一种 ...
- 【SQLServer】验证身份证号第18位校验码是否合法
目录 1.业务场景 2.知识前提 3.实现方案 4.测试 5.参考链接 1.业务场景 参考国家标准GB 11643-1999,居民身份证号组成:6位数字地址码+8位数字出生日期码+3位数字顺序码+1位 ...
- 16Aspx.com-将15位身份证转换成18位
16Aspx.com-将15位身份证转换成18位 //************************************************************************* ...
- 身份证号第18位的计算
身份证号每一位号码的意义 首选需要声明两点, 第18位为x:其实对应与编码系统中的10(十),因为进制的关系了: 第18位的取值是前面17位通过一定的编码规则(ISO 7064:1983.MOD 11 ...
- python计算小数点后有几位_python的数字类型
python的数字类型分为三种,分别是整数int. 浮点数float 和 复数complex. 数字是由数字字面值或内置函数与运算符的结果来创建的, 不带修饰的整数字面值会生成整数.包含小数点或幂运算 ...
- python 24位图转 8位_Python爬取PPT模板小工具下载-Python爬取PPT模板小工具免费版下载v1.0...
由于很多PPT抓取工具都会因为版本问题无法使用,所以论坛大神就自己写了这款Python爬取PPT模板小工具,可以帮助用户轻松获取各种PPT模板,使用的时候注意一次只能下载一种类型.软件仅供交流学习,下 ...
- python截取字符串后三位_python如何截取字符串后几位
字符串切片也就是截取字符串,取子串. Python中字符串切片方法 字符串[开始索引:结束索引:步长] 切取字符串为开始索引到结束索引-1内的字符串 步长不指定时步长为1,字符串[开始索引:结束索引] ...
最新文章
- .NET base与this
- Mybatis如何打印sql语句
- 关于《用C#编写ActiveX控件》的几点说明
- LeetCode 第 186 场周赛(1060/3107,前34.1%)
- java代码题_精选20道Java代码笔试题
- 使用deeplearning4j训练Word2Vec(Java操作)
- 回望iQOO一周年:子品牌战略的成功之路
- 网页版简书界面优化小建议
- 针孔相机的标定原理与实现
- 模拟双色球系统判断中奖情况
- TypeScript配置、tsconfig.json配置文件,TypeScript使用详解
- Leetcode 电话号码的字母组合
- Oracle数据库的视图、物化视图、序列、同义词、索引
- 租房子,光看数据怎么够,Python爬取某站租房图片
- NOIP2013普及组 题解
- 使用XCA工具生成SSL证书
- 如何批量修改文件后缀名?(批量修改文件的扩展名)
- WebView---android webview组件如何使用 Webview与js交互
- 我的网站http://www.xhu.cn/xhu/520/
- 《2019/04/12》java下载抖音视频