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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 正则匹配^和$使用问题相关的知识,希望对你有一定的参考价值。

我写了一个匹配手机的正则表达式p=re.compile(‘^1[358]\d9$|^147\d8$')
想用以下方式输出,却总是无输出(应该是没有匹配到),但是换成p=re.compile(’1[358]\d9|147\d8')又可以了,这是为什么??
for match in re.findall(p, input):
print match

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

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

追答

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

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

参考技术A 可能你的input变量里面可能是有回车符或其他。所以结尾是\r而不是\d.另外上面那个表达式的第一个引号写错了。 参考技术B

你把

p=re.compile(‘^1[358]\\d9$|^147\\d8$')

修改成

p=re.compile(/^1[358]\\d9$|^147\\d8$/)

再试试

追问

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

追答

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

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

追问

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

追答

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

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

本回答被提问者采纳

以上是关于python 正则匹配^和$使用问题的主要内容,如果未能解决你的问题,请参考以下文章

python - re正则匹配模块

python正则表达式

强烈推荐!Python 这个宝藏库 re 正则匹配

用于匹配单行和多行注释的 Python 正则表达式。

Python 24天 正则表达式

在python中使用正则表达式