正则表达式实现身份证信息验证

一、任务描述

  西普工程师想了解正则表达式,为达到更好的对正则更深入的认知,打算利用正则表达式实现身份证信息的验证的实验,结合Python的基础知识实现并填写工作报告。

二、任务目标

1)熟悉Python的基本操作

2)掌握正则的原理及操作

三、任务环境

Ubuntu16.04、Python2.7.13

四、任务分析

  正则表达式是用于处理字符串的强大工具,它并不是Python的一部分。

  其他编程语言中也有正则表达式的概念,区别只在于不同的编程语言实现支持的语法数量不同。

  它拥有自己独特的语法以及一个独立的处理引擎,在提供了正则表达式的语言里,正则表达式的语法都是一样的。

  下图展示了使用正则表达式进行匹配的流程:

  正则表达式的大致匹配过程是:

  1、依次拿出表达式和文本中的字符比较,

  2、如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。

  3、如果表达式中有量词或边界,这个过程会稍微有一些不同。

 

 ♥ 知识链接
正则表达式
  构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
 ♥ 温馨提示
正则表达式是re模块

五、任务实施

步骤1、环境准备

  右击Ubuntu操作系统桌面,从弹出菜单中选择【Open in Terminal】命令 打开终端。

  通过【cd /home】进入home目录下,如图1所示。

图1 home目录下

  在home目录下通过【mkdir idcard】创建程序的文件夹,如图2所示。

图2 创建文件夹

  通过【cd idcard】进入idcard目录下,在该目录下通过【touch idcard.py】创建Python文件,如图3所示。

图3 创建idcard.py文件

  编辑idcard.py文件,使用【vim idcard.py】,回车后进入到idcard的编辑框内,如图4所示。

图4 编辑Python文件

步骤2、Python 程序

  在新建的Python文件中,写入如下程序,如图5所示

  1. # coding:utf-8 编码设置为utf-8,必须设置,有多中写法。
  2. import re python正则表达式模块。
图5 模块

  处理得到的身份证号,分别得到生日等字段,如图6所示。

图6 截取字段

  首先对前两位进行验证,是否是合法的,再次对闰年与平年进行验证,分别写不同正则表达式对身份证号码进行验证,(正则表达式本身为一行,由于显示的原因进行换行,正则表达式内本身是没有单引号的,表达式开头与结尾是有单引号)如图7所示。

图7 身份验证

  通过re.match测试出生日期的合法性,对身份证信息的每一位进行校验,将结果除以11求余,得到校验码,具体原理可百度身份证的校验原理。如图8所示

图8 校验码

  将得到的校验码与身份证最后一位相匹配,正确后并得到出生信息与性别并输出,否则提示报错信息,如图9所示。

图9 检验校验码

  python程序中main方法与Java的main方法作用类似,程序的主入口,调用上面所有的检查身份证信息的函数,如图10所示。

图10 main方法

  程序源码如下所示

# coding:utf-8
import re    # python正则表达式模块数
#函数
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转为string类型
    idcard=idcard.strip()  # 默认删除空白符
    idcard_list=list(idcard)  # 将idcard 放入列表中
    idcard_brith = idcard[6:14]  # 生日字段
    idcard_sex = idcard[14:17]  # 性别字段
    year = idcard_brith[0:4]  #
    month = idcard_brith[4:6]  #
    day = idcard_brith[6:8]  #
    #地区校验,验证输入的前两位
    if(not area[(idcard)[0:2]]):
        print Errors[4]
    #18位身份号码检测
    elif(len(idcard)==18):
        #出生日期的合法性检查
        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 # 求余
            JYM = "10X98765432"
            M = JYM[Y]#判断校验位
            if(M == idcard_list[17]):#检测ID的校验位
                print Errors[0]
                print ('生日:'+year+''+ month +''+day+'')
                if int(idcard_sex)%2 == 0:
                    print ('性别:女')
                else:
                    print ('性别:男')
            else:
                print Errors[3]
        else:
            print Errors[2]
    else:
        print Errors[1]
if __name__ == '__main__':
    idcard = raw_input(u'请输入身份证号码:')
    checkIdcard(idcard)

 

六、任务测试

步骤1、运行程序

  编辑完成后,按【esc】退出编辑状态【:wq】保存并退出编辑框,执行【python idcard.py】运行Python文件。效果图如11所示

图11 运行程序

步骤2、验证程序

  输入身份证号码,正确会提示正确的信息,相反错误会提示相关错误的信息。(为了隐私性,下图身份证后四位不展示)如图12所示。

 

图12 验证
posted @ 2018-05-17 13:18  薛乔毓  阅读(4600)  评论(0编辑  收藏  举报