情况是有多条记录,每条记录由一串数字构成,在不确定的位置上出现身份证号码,身份证号只会出现一次且没有其他类似身份证号的数字串。如何通过编程的方法自动识别出身份证号的位置,用 r 或者 python 实现的话要用到什么包,请各位大侠指点,多谢。
1
okKO 2017-05-11 18:19:50 +08:00 via Android
正则表达式处理这个没难度吧~
|
2
grimpil 2017-05-11 18:20:13 +08:00
正则表达式吧
|
4
zjqzxc 2017-05-11 18:27:15 +08:00
正则匹配 18/17 位(必要时候还需要考虑 15 位)数字
如果不放心是否会出现干扰字符串的话,取出来的结果检验一下最后一位的校验位 |
5
shaobo76 OP @zjqzxc 假设这个数字串有 100 个数字构成,怎么匹配 18 位数字呢,那不是会命中很多个?
|
6
oh 2017-05-11 18:37:33 +08:00 6
根据身份证号码的含义,第 7-14 是生日,那基本可以确定:
- 第 7 位要么是 1 要么是 2 ( 1xxx 年 - 2xxx 年); - 第 11 位要么是 0 要么是 1 ( 0x 月 - 1x 月); - 第 13 位的范围是 0 - 3 ( 0x 日 - 3x 日); - 第 18 位除了是数字还有可能是 X ; 有了这几个限定位,很大程度上可以避免干扰了(当然要根据具体的内容而定,如果是几百几千个数字里面去找出 18 位身份证,那就不成立了)。 正则大概可以写为: \d{6}[1-2]\d{3}[0-1]\d[0-3]\d{4}[0-9xX] 简单测试了一下,可能考虑不周。 |
7
oh 2017-05-11 18:39:24 +08:00
@shaobo76
如果是在 100 个数字串里面去找 18 位身份证号码,那根据上面提取之后,最好是用身份证号码校验公式校验一次(身份证第 18 位是校验符,以此检测身份证号码的合法性),网上搜一下就有计算公式。 |
8
kaneg 2017-05-11 18:40:52 +08:00 via iPhone
先用正则缩小范围,比如在 n 个字符串里找到 m 个候选项,然后再用程序严格的分析,比如最后的检验位是否匹配
|
10
maxmilia 2017-05-11 18:51:07 +08:00
匹配 18 个数字,按验证的算法算算验证位合法不,哈哈哈哈哈
|
11
maxmilia 2017-05-11 18:52:10 +08:00
哦 不对 还有 x
|
12
ynyounuo 2017-05-11 18:52:10 +08:00 1
@ynyounuo 根据 #6 改了一下
/([1-8][0-9])\d{4}(19|20)(\d{2})(0?[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])(\d{3})[\dXx]/ |
13
shaobo76 OP 谢谢大家,我去尝试一下(•̀⌄•́)
|
14
zhihaofans 2017-05-11 20:03:24 +08:00 2
tool.oschina.net 找到正则测试,右边有身份证的例子
|
15
dream7758522 2017-05-11 20:11:06 +08:00 via Android
很简单,不过我这方法可能效率不高。首先读前 18 个字符串,判断是否是身份证,然后从字符串第二位开始读 18 位字符串,判断。如此循环。文件不是很大的话,应该很简单方便。写正则的话可能还要多次验证正则表达式写的是否正确,很花时间的,与其浪费自己的时间,还不如浪费电脑的时间。
|
17
geelaw 2017-05-12 00:59:03 +08:00
首先前 6 位和出生地 /户籍有关,只有有限种可能,找到这个表;
然后是 8 位或 6 位生日,可以用求余数的方法判断年份是否是闰年,然后判断月、日的组合是否 valid ; 然后是 3 位任意的数; 最后是校验位,这位也可以通过前面的算出来,而且很容易(因为是前面几位线性组合求余数)。 于是你可以画一个 NFA,然后再把它转换为正则表达式。 |
18
JerryV2 2017-05-12 09:12:10 +08:00
@dream7758522 正则是值得花时间练习的,不是浪费时间啊兄弟
|
19
AyoCross 2017-05-12 09:19:34 +08:00
+1,正则这东西需要经常练练手,否则时间长了规则就忘了
|
20
springz 2017-05-12 10:58:05 +08:00
身份证号有特殊规则,正则取出符合格式的字符串,再走一遍效验就可以了
|
21
springz 2017-05-12 11:00:05 +08:00
|
22
billgreen1 2017-05-12 11:50:11 +08:00
@geelaw 我和你想的一样,现在很多正则表达式,把一些不是身份证的也给匹配出来了
|
23
killerv 2017-05-12 12:26:14 +08:00
根据身份证号码的规则写个正则,应该没问题
|
24
as463419014 2017-05-12 15:15:35 +08:00
|