python 正则匹配^和$使用问题

我写了一个匹配手机的正则表达式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

^表示开始的意思。$表示结尾。match这个东西很奇怪。它是从开始做匹配的。 通常我会使用search而不是用match。 findall也是用search的机制。因为它是findall所以,就不可能用^作为字符串开头。因为字符串只有一个开头,但是有很多的”电话号码“。同样一个字符串也只有一个结尾 。你如果有结尾也不合适。追问

因为在匹配时有一些不正确的数字会匹配进去,比如从身份证号提取了一段认为是手机号码,我就想写一个只匹配我表达是里面的那些,应该怎么做呢?

追答

身份证号显然,它前面与后面都不是数字。可以试试这样的方法(?<!\d+)1\d{10}

还有一个办法,你把所有数字串全整段出来了\d+。然后检查长度,如果18就是身份证,如果是11就是手机。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-11-06
可能你的input变量里面可能是有回车符或其他。所以结尾是\r而不是\d.另外上面那个表达式的第一个引号写错了。
第2个回答  推荐于2016-02-08

你把

p=re.compile(‘^1[358]\d{9}$|^147\d{8}$')

修改成

p=re.compile(/^1[358]\d{9}$|^147\d{8}$/)

再试试

追问

还是不行,而且加一个/也不明白是什么道理

追答

加斜杠是更规范的写法 有些语言使用正则匹配的时候 你用引号包的意思就是匹配字符串 用/的意思就是匹配正则表达式。

不过阁下说不加^$时能匹配到 加了却匹配不到 可能是你的字符串不纯正 看得出你要匹配的是电话号码 不过你的字符串在电话号码前后还有其它字符吗 包括空字符也不行
因为^表示匹配字符串的开始 $表示匹配字符串的结尾 若你同时使用这两个 那么则保证字符串是与你要匹配的是绝对一致的 两端都不得有其它字符才行

追问

十分感谢,我已经明白错误在哪了,但是我在匹配时有一些不正确的数字会匹配进去,比如从身份证号提取了一段认为是手机号码,应该怎么做才能只匹配我表达是里面的那些?

追答

这个不用担心 你看你写的规则 刚才是11位 若在前后分别加了^和$的话 那么就不用担心了
但若你只是想判断这一串字符串中是否有电话号码的话 那就比较麻烦了
首先,若手机号码前后都不应该有数字的话 那么你在你的规则前面加上一个 \D 即可
若手机号码前后可以有数字的话 那跟身份证号码扯上关系就更麻烦了 当然首先可以判断是不是身份证号码的15位或18位数字 再判断是否是身份证号码 若否再判断是否含有手机号码

总之,还是要看你匹配字符串的规律,比较麻烦的情况自然匹配就更麻烦

本回答被提问者采纳
相似回答