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

一、任务描述

??西普工程师想了解正则表达式,为达到更好的对正则更深入的认知,打算利用正则表达式实现身份证信息的验证的实验,结合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 验证

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


jquery.validate使用攻略(表单校验) 目录 jquery.validate使用攻略1 第一章 jquery.validate使用攻略1 第二章 jQuery.validate.js API7 Custom selectors7 Utilities8 Validato
/\s+/g和/\s/g的区别 正则表达式/\s+/g和/\s/g,目的均是找出目标字符串中的所有空白字符,但两者到底有什么区别呢? 我们先来看下面一个例子: let name = 'ye wen jun';let ans = name.replace(/\s/g, '&#3
自整理几个jquery.Validate验证正则: 1. 只能输入数字和字母 /^[0-9a-zA-Z]*$/g jQuery.validator.addMethod("letters", function (value, element) { return this.optio
this.optional(element)的用法 this.optional(element)是jquery.validator.js表单验证框架中的一个函数,用于表单控件的值不为空时才触发验证。 简单来说,就是当表单控件值为空的时候不会进行表单校验,此函数会返回true,表示校验通过,当表单控件
jQuery.validate 表单动态验证 实际上jQuery.validate提供了动态校验的方法。而动态拼JSON串的方式是不支持动态校验的。牺牲jQuery.validate的性能优化可以实现(jQuery.validate的性能优化见图1.2 jQuery.validate源码 )。 也可
自定义验证之这能输入数字(包括小数 负数 ) <script type="text/javascript"> function onlyNumber(obj){ //得到第一个字符是否为负号 var t = obj.value.charAt(0); //先把非数字的都
// 引入了外部的验证规则 import { validateAccountNumber } from "@/utils/validate"; validator.js /*是否合法IP地址*/ export function validateIP(rule, value,cal
VUE开发--表单验证(六十三) 一、常用验证方式 vue 中表单字段验证的写法和方式有多种,常用的验证方式有3种: data 中验证 表单内容: <!-- 表单 --> <el-form ref="rulesForm" :rules="formRul
正则表达式 座机的: 例子: 座机有效写法: 0316-8418331 (010)-67433539 (010)67433539 010-67433539 (0316)-8418331 (0316)8418331 正则表达式写法 0\d{2,3}-\d{7,8}|\(?0\d{2,3}[)-]?\d
var reg = /^0\.[1-9]{0,2}$/;var linka = 0.1;console.log (reg.test (linka)); 0到1两位小数正则 ^(0\.(0[1-9]|[1-9]{1,2}|[1-9]0)$)|^1$ 不含0、0.0、0.00 // 验证是否是[1-10
input最大长度限制问题 <input type="text" maxlength="5" /> //可以 <input type="number" maxlength="5" /> //没有效
js输入验证是否为空、是否为null、是否都是空格 目录 1.截头去尾 trim 2.截头去尾 会去掉开始和结束的空格,类似于trim 3.会去掉所有的空格,包括开始,结束,中间 1.截头去尾 trim str=str.trim(); // 强烈推荐 最常用、最实用 or $.trim(str);
正则表达式语法大全 字符串.match(正则):返回符合的字符串,若不满足返回null 字符串.search(正则):返回搜索到的位置,若非一个字符,则返回第一个字母的下标,若不匹配则返回-1 字符串.replace(正则,新的字符串):找到符合正则的内容并替换 正则.test(字符串):在字符串中
正整数正则表达式正数的正则表达式(包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+\d)|0)$正数的正则表达式(不包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+
JS 正则验证 test() /*用途:检查输入手机号码是否正确输入:s:字符串返回:如果通过验证返回true,否则返回false /function checkMobile(s){var regu =/[1][3][0-9]{9}$/;var re = new RegExp(regu);if (r
请输入保留两位小数的销售价的正则: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/ 1.只能输入英文 <input type="text" onkeyup="value
判断价格的正则表达式 价格的正则表达式 /(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/; 1 解析:价格符合两种格式 ^ [1-9]\d*(.\d{1,2})?$ : 1-9 开头,后跟是 0-9,可以跟小数点,但小数点后要带上 1-2 位小数,类似 2,2
文章浏览阅读106次。这篇文章主要介绍了最实用的正则表达式整理,比如校验邮箱的正则,号码相关,数字相关等等,本文给大家列举的比较多,需要的朋友可以参考下。_/^(?:[1-9]d*)$/ 手机号
文章浏览阅读1.2k次。4、匹配中的==、an==、== an9、i9 == "9i"和99p==请注意下面这部分的作用,它在匹配中间内容的时候排除了说明:当html字符串如下时,可以匹配到两处,表示匹配的字符串不包含and且不包含空白字符。说明:在上面的正则表达式中,_gvim正则表达式匹配不包含某个字符串
文章浏览阅读897次。【代码】正则表达式匹配a标签的href。_auto.js 正则匹配herf