缘起
最近开始学习正则表达式了,看着Python核心编程(第三版),想着要不做个寻找电话号码的程序吧!
说干就干,先造个例句。
# 导入正则表达式模块,目标字符串预处理
import re
s = "this is a book+86133-1234-5678是最好的地很好哦么:电话号码了blahblahblah@blah.com为什么是cai的作家010 8888 8888或jinitaimei.cai@figit-asia.com.cn者18234567891web看到了sbminiworld@small.net谢谢。"
这是一个藏满电话号码和email的字符串(当然这些号码都是假的)
好了,我们现在有个奇妙的句子,我们要揪出电话号码,就要用正则表达式(我的码呀,终于说到主题了!)来搜啦。
移动电话号码
# 适用于各种变态移动电话格式
re.findall('(?:\+86)?1[3|8][0-9]{1}[-| ]?\d+[-| ]?\d+',s)
这是个神奇的findall语句,里面的是电话号码的正常格式(我是萌新,做得不太好)。首先是个可有可无的+86,我在这里使用了(?:…)的方法把他圈了起来,再用’?'表示他没有人权。1是因为大部分电话开头都是一(吧)。[3|8]3或8作为第二位数字,开头最后一位是一位数字,用[0-9]{1}作为最后一个数字,[-| ]?(你认为下面是数字,还没有吧,这玩意不是数字,ko no 符号da!)是一个符号,以免一堆网站写成这样你还搜不出来,也有可能没有符号,所以写个?。然后是个不用解释的\d+,然后又是个[-| ]?,最后的几个数字照旧。
固定电话号码
# 适用于全球大多国家的固定电话号码
re.findall('\+?(?:[0-9]{1,86})?[\(|\(| |-]?[ ]?[0|8][0-9]{0,4}[\)|\)| |-]?[ ]?[0-9]{3,4}[ |-]?[0-9]{3,4}[ |-]?[0-9]{0,4}',s)
就是个在移动电话查询的基础上增加了一些东西的东西。主要注意的的是[(|\(| |-]?是一起的,有可能是(、(、 ‘ ’ 或 -,另一边相仿。
这个正则表达式可以解决全球绝大多数国家的固定电话识别,问我为啥这么自信???我苦命,你们可以去问我程序员的爹,或者看文章最后的截图。
email查询
# 可以识别几乎所有email格式
re.findall('[A-Za-z0-9]{2,20}[-|.]?[A-Za-z0-9]{2,20}?@[A-Za-z0-9]{1,20}[-|.]?[A-Za-z0-9]{2,20}[-|.]?(?:[A-Za-z0-9]{2,20})?[-|.]?(?:[A-Za-z0-9]{2,20})?',s)
电子邮件基本上是分两边而行,一边为@之左,一边为@之右。左边只用考虑字母数字和特殊符号,另一边要考虑到多少个点,多少个com,cn,name,net等,所以就比较麻烦。
最后想说点感受
让大家看看苹果全球网站的号码提取效果哈~
(打个广告,Xnip真好用)
刚刚开始学习,以上有问题的地方欢迎拍砖,不吝赐教。
打完,下课。