利用正则表达式验证身份证合法性
时间: 2025-02-18 15:30:27 浏览: 82
### 使用正则表达式验证中国身份证号码的有效性
对于中国的身份证号码,存在两种长度的标准形式:15位和18位。为了确保这些编号的合法性,可以通过构建特定模式的正则表达式来进行匹配。
#### 验证15位身份证号码
针对早期使用的15位编码方案,其结构由六位地址码、六位出生日期码以及三位顺序码组成。适用于该类型的正则如下:
```regex
^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$
```
这条规则能够识别有效的地区代码开头,并且保证月份范围在合理区间内(即1月至12月),同时也考虑到了每个月可能的最大天数[^1]。
#### 验证18位身份证号码
随着时代发展,现在普遍采用的是更为精确的18位版本,在原有基础上增加了四位额外的信息用于表示具体的年份以及一个校验字符。对应的正则表达式为:
```regex
^(?!^\d{17}[0-9]{17})([0-9]|X|x)$
```
上述表达式的前半部分`(?![^a-zA-Z\d]+)`排除了纯字母的情况;中间的部分`([0-9]{17})`指定了前17位应全部为数字;最后一项`([0-9]|X|x)`允许第十八位要么是一个数字,要么是大小写的'X'[ ^5 ]。
值得注意的是,虽然以上两条正则可以帮助初步筛选出看似合理的身份证号,但对于某些特殊情况下的逻辑错误(比如非法的生日组合或是不正确的校验位)并不能完全捕捉到。因此,在实际应用场景中往往还需要进一步结合业务需求加入更多层次的数据清洗与核对机制。
#### Python实现示例
下面给出一段基于Python语言的具体实现案例,它不仅会运用上面提到的正则去过滤掉明显不符合条件的身份证明序列,还会尝试依据官方提供的算法来确认最终一位校验字是否准确无误。
```python
import re
def validate_id_number(id_num):
pattern_18 = r'(^\d{17}(\d|x|X)$)'
if not isinstance(id_num, str) or len(id_num) != 18:
return False
if not re.match(pattern_18, id_num):
return False
weight_factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_codes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
sum_of_products = sum(int(a)*b for a,b in zip(list(id_num[:-1]),weight_factors))
calculated_check_code = check_codes[(sum_of_products % 11)]
return True if calculated_check_code.upper() == id_num[-1].upper() else False
print(validate_id_number('123456789012345678')) # 输出False
print(validate_id_number('12345678901234567X')) # 输出True 或者 False取决于具体数值
```
阅读全文
相关推荐


















