之前写了一个身份证校验的正则表达式^(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代码把该正则表达式分块并添加了详细注释。
此外,有两点要说明:
- 正则表达式匹配数字使用了
[0-9]
,而不是\d
,这是因为\
在很多编程语言要写成"\\d"
,写成斜杠形式不方便移植。 - 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')
网友评论