我写了一个匹配手机的正则表达式p=re.compile(‘^1[358]\d{9}$|^147\d{8}$')
想用以下方式输出,却总是无输出(应该是没有匹配到),但是换成p=re.compile(’1[358]\d{9}|147\d{8}')又可以了,这是为什么??
for match in re.findall(p, input):
print match
因为在匹配时有一些不正确的数字会匹配进去,比如从身份证号提取了一段认为是手机号码,我就想写一个只匹配我表达是里面的那些,应该怎么做呢?
追答身份证号显然,它前面与后面都不是数字。可以试试这样的方法(?<!\d+)1\d{10}
还有一个办法,你把所有数字串全整段出来了\d+。然后检查长度,如果18就是身份证,如果是11就是手机。
你把
p=re.compile(‘^1[358]\d{9}$|^147\d{8}$')修改成
p=re.compile(/^1[358]\d{9}$|^147\d{8}$/)再试试
还是不行,而且加一个/也不明白是什么道理
追答加斜杠是更规范的写法 有些语言使用正则匹配的时候 你用引号包的意思就是匹配字符串 用/的意思就是匹配正则表达式。
不过阁下说不加^$时能匹配到 加了却匹配不到 可能是你的字符串不纯正 看得出你要匹配的是电话号码 不过你的字符串在电话号码前后还有其它字符吗 包括空字符也不行
因为^表示匹配字符串的开始 $表示匹配字符串的结尾 若你同时使用这两个 那么则保证字符串是与你要匹配的是绝对一致的 两端都不得有其它字符才行
十分感谢,我已经明白错误在哪了,但是我在匹配时有一些不正确的数字会匹配进去,比如从身份证号提取了一段认为是手机号码,应该怎么做才能只匹配我表达是里面的那些?
追答这个不用担心 你看你写的规则 刚才是11位 若在前后分别加了^和$的话 那么就不用担心了
但若你只是想判断这一串字符串中是否有电话号码的话 那就比较麻烦了
首先,若手机号码前后都不应该有数字的话 那么你在你的规则前面加上一个 \D 即可
若手机号码前后可以有数字的话 那跟身份证号码扯上关系就更麻烦了 当然首先可以判断是不是身份证号码的15位或18位数字 再判断是否是身份证号码 若否再判断是否含有手机号码
总之,还是要看你匹配字符串的规律,比较麻烦的情况自然匹配就更麻烦