美文网首页我爱编程
身份证校验正则表达式

身份证校验正则表达式

作者: redexpress | 来源:发表于2018-05-25 23:30 被阅读101次

    之前写了一个身份证校验的正则表达式^(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|82|[7-9]1)[0-9]{4}(((19|20)[0-9]{2}(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((19|20)(0[48]|[2468][048]|[13579][26])0229)|(20000229))[0-9]{3}[0-9Xx]$,这个看起来很长,其实不难理解。下面的Python代码把该正则表达式分块并添加了详细注释。

    此外,有两点要说明:

    1. 正则表达式匹配数字使用了[0-9],而不是\d,这是因为\在很多编程语言要写成"\\d",写成斜杠形式不方便移植。
    2. Python的正则表达式支持扩展模式,会忽略正则表达式里面的空格和注释。如果你需要匹配空格的话,可以放在方括号里面,这样写[ ]
    import re
    
    
    regex = '''^                                                            # Line 1
    ( 1[1-5] | 2[1-3] | 3[1-7] | 4[1-6] | 5[0-4] | 6[1-5] | 82 | [7-9]1 ) [0-9]{4}  # 前6位,表示地址
    (                                                                       # Line 3
        (                      # Line 5 到 Line 11 表示平年每月有多少天                                                                  
            ( 19 | 20 ) [0-9]{2}                            # 1900 - 2099   # Line 5
            (                                                                     
                ((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))  # 有31天的月份    # Line 7
              |                                                                    
                ( (0[469]|11) ( 0[1-9] | [12][0-9] | 30 ) ) # 有30天的月份    # Line 9
              |                                                                     
                (02(0[1-9]|[1][0-9]|2[0-8]))                # 平年2月28天     # Line 11
            )                                                                      
        )                                                                    # Line 13
      |                                                                             
        ((19|20)( 0[48] | [2468] [048] | [13579][26] )0229) # 闰年(能被4整除)  # Line 15
      |                                                                            
        (20000229)             # 闰年(能被400整除),合理年份只有2000年          # Line 17
    )                                                                              
    [0-9]{3} [0-9Xx]           # 后4位,3位为序号位和1位校验位                   # Line 19
    $'''
    
    id_card_number = '41282719920815011x'
    match = re.compile(regex, re.X).match(id_card_number)
    if match:
        print('match')
    

    相关文章

      网友评论

        本文标题:身份证校验正则表达式

        本文链接:https://www.haomeiwen.com/subject/cidpjftx.html