20210113.正则表达式匹配多种电话号码时,发现findall()与search()返回结果不一致

20210113.正则表达式匹配多种电话号码时,发现findall()与search()返回结果不一致

#这段代码本是想独立做出《python编程快速上手——让繁琐工作自动化》一书7.15的演示项目(在一段文本中提取电话号码和Email地址)
#然而正则写好并用search()多番测试成功之后,却卡在了findall()方法返回的令人费解的结果上。问题先贴在这里,以后再解决吧。

#电话号码的样式:”445-445-4444” 或 ”445 445 4444” 或 ”445.445.4444” 这几种样式。前三位是区号(区号也有可能不存在,例如”445 5555“)
#最后还有可能加分机号2-5个数字,分机号前可能是任意数目空格,然后ext或x或ext,然后是0-多个空格. 例如:”445-445.4444 ext2533”

#这段代码本是想独立做出《python编程快速上手——让繁琐工作自动化》一书7.15的演示项目(在一段文本中提取电话号码和Email地址)
#然而正则写好并用search()多番测试成功之后,却卡在了findall()方法返回的令人费解的结果上。问题先贴在这里,以后再解决吧。

#电话号码的样式:”445-445-4444” 或 ”445 445 4444” 或 ”445.445.4444” 这几种样式。前三位是区号(区号也有可能不存在,例如”445 5555“)
#最后还有可能加分机号2-5个数字,分机号前可能是任意数目空格,然后ext或x或ext,然后是0-多个空格. 例如:”445-445.4444 ext2533”
#现在据此做一个正则表达式:

import re
phoneReg=re.compile(r'''
     (  ( \d{3} |  \( \d{3} \) ) (\s|\.|-) )?    #前三位是区号以及区号后面的连字符。(区号有可能不存在)
     \d{3}        (\s|\.|-)                      #三位数字。以及其后的连字符
     \d{4}                                       #四位数字,
     (  (\s+ ( ext|x|ext\.) ) \s* (\d{2,5}) )?   #分机号前面的连字符,以及分机号。(分机号有可能不存在)
           ''',re.VERBOSE)
testtext='kasquoeuirqew 135-245-4444 aiupqewrkj' \
         'dsfljvxz 945 465 4844 peqi' \
         'rupiuasdf 045.445.4404 adshlf' \
         'jhlsadjjhljq 745-412.4944 ext2533' \
         'asdkd55455968 aguyfdsqewhr 1234567' \
         'asdkd6845-5968 aguyfdsqewhr 623.4567' \
         'asdalh 123 4567ext.    9999' \
         'qewrreuoy  765-4321   ext.8888'
print(phoneReg.search(testtext))
print( phoneReg.findall(testtext)  )   #findall为匹配所有。search为匹配一次.
#我的正则跟书上的实例并不一样,第一行的正则,能更好的甄别区号不存在的情况。
#使用search()方法测试了testtext中的各种号码,全部测试通过,正则写得还是比较满意的。
#然而问题出现了:就是search()方法返回的结果,跟findall()方法返回的元组中的第一个元素,并不一致。findall()方法返回的结果极其凌乱。
#查了查,似乎是因为正则中的括号导致的。那么问题来了,怎样才能在不改变这个正则式的情况下,让findall()方法返回的元组跟search()方法一致呢?

这段代码运行后,search(testtext)的结果正常:

<_sre.SRE_Match object; span=(14, 26), match='135-245-4444'>

findall(testtext)的结果则是一片混乱:

[('135-', '135', '-', '-', '', '', '', ''), ('945 ', '945', ' ', ' ', '', '', '', ''), ('045.', '045', '.', '.', '', '', '', ''), ('745-', '745', '-', '.', ' ext2533', ' ext', 'ext', '2533'), ('', '', '', '-', '', '', '', ''), ('', '', '', '.', '', '', '', ''), ('', '', '', ' ', '', '', '', ''), ('', '', '', '-', '   ext.8888', '   ext.', 'ext.', '8888')]

有啥好的解决办法呢?

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值