日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python身份证号码解析编程_Python实现身份证号码解析

發布時間:2024/8/1 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python身份证号码解析编程_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

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

總結

以上是生活随笔為你收集整理的python身份证号码解析编程_Python实现身份证号码解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。