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')]
有啥好的解决办法呢?