我正在尝试使用 Python 和 RegEx 从网页中提取电话号码
澳大利亚数字格式
+61(国际代码 - 下面显示为“i”)
02、03、07 或 08(州代码 - 在下面显示为“s”)
1234-5678(8 位本地号码 - 显示为“x”)
格式的常见变体(按通用性顺序排列):
格式 1:ss xxxx xxxx(例如 02 1234 5678)
格式 2:+ii s xxxx xxxx(例如 +61 2 1234 5678)(注意此处删除了第一个 's' 数字)
格式 3:(很少见)+ii (s)s xxxx-xxxx(例如 +61 (0)2 1234 5678
我的正则表达式:
re.findall(r'[0][2]\d{8}|[0][3]\d{8}|[0][7]\d{8}|[0][8]\d{8}|[6][1][2]\d{8}|[6][1][3]\d{8}|[6][1][7]\d{8}|[6][1][8]\d{8}|[0][4]\d{8}|[6][1][4]\d{8}|[1][3][0][0]\d{6}|[1][8][0][0]\d{6}', re.sub(r'\W+', '', sample_text))
适用于简单的示例文本:
sample_text = "610212345678ABC##610312345678ABC##610712345678ABC##610812345678ABC##0212345678ABC##0312345678ABC##0712345678ABC##0812345678ABC##61212345678ABC##61312345678ABC##61712345678ABC##61812345678ABC##0412345678ABC##61412345678ABC##130012345678ABC##180012345678ABC##"
结果:
['0212345678', '0312345678', '0712345678', '0812345678', '0212345678', '0312345678', '0712345678', '0812345678', '61212345678', '61312345678', '61712345678', '61812345678', '0412345678', '61412345678', '1300123456', '1800123456']
目标
以 http://www.outware.com.au/contact 为例...
页面上的 2 个实际数字是:
+61 (0)3 8684 9912 和 +61 (0)2 8064 7043(这两个号码出现两次 - 一次在页面的主要部分,一次在页脚)
问题
#take HTML markup from body tags
b = driver.find_element_by_css_selector('body').text
#remove all non-alpha + white space.
b = re.sub(r'\W+', '', b)
结果:
"PORTFOLIOINNOVATIONSERVICESCAREERSINSIGHTSNEWSABOUTCONTACTCONTACTOUTWAREMelbourneLe......AFRFast100Nov92017EXPLOREOUTWAREPortfolioInnovationWorkingatOutwareAboutSitemapCONNECTMELBOURNELevel3469LaTrobeStMelbourneVIC3000610386849912SYDNEYLevel41SmailStUltimoNSW2007610280647043"
现在,如果我将正则表达式应用于该字符串
re.findall(r'[0][2]\d{8}|[0][3]\d{8}|[0][7]\d{8}|[0][8]\d{8}|[6][1][2]\d{8}|[6][1][3]\d{8}|[6][1][7]\d{8}|[6][1][8]\d{8}|[0][4]\d{8}|[6][1][4]\d{8}|[1][3][0][0]\d{6}|[1][8][0][0]\d{6}', re.sub(r'\W+', '', b))
结果:
[u'0386849912'、u'0761028064'、u'0386849912'、u'0761028064']
我收到误报,因为我已将邮政编码“NSW2007”连接到电话号码的开头。
我认为因为正则表达式已经解析了与“0761028064”匹配的“NSW2007610280647043”的第一部分,所以它不匹配“0280647043”,它也是同一子字符串的一部分
我实际上并不介意误报(即得到“0761028064”),但我确实需要解决误报(即没有得到“0280647043”)
我知道这里有一些正则表达式专家可以提供帮助。 :-)
请帮忙!!
最佳答案
在使用正则表达式之前不要搜索/替换任何文本。这将使您的输入无法使用。试试这个:
(?:(?:\+?61 )?(?:0|\(0\))?)?[2378]\d{4}[ -]?\d{4}
关于澳大利亚电话号码的 Python RegEx - 漏报 - 同一子字符串中有 2 个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48470964/