我正在尝试使用Python& amp;从网页中提取电话号码正则表达式
澳大利亚数字格式
+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)(请注意,此处删除了第一个''数字)
格式3 :(很少见)+ ii(s)s xxxx-xxxx(例如+61(0)2 1234 5678
我的RegEx :
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:
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"到电话号码的开头。
我认为因为正则表达式解析了#34; NSW2007610280647043"的第一部分。匹配" 0761028064"它没有匹配" 0280647043"它也是同一子串的一部分
我实际上并不介意误报(即获得" 0761028064")但我确实需要解决假阴性(即没有得到" 0280647043")
我知道这里有一些RegEx大师可以为此提供帮助。 : - )
请帮助!!
答案 0 :(得分:1)
如果你使用负向前看来检查以确保以下字符不是数字,这可能会有所帮助。例如:(?!\d)
。
如果电话号码后面的某些数据以数字开头,这可能会产生问题。
在正则表达式中实现时,背后的外观如下所示:
(02\d{8}|03\d{8}|07\d{8}|08\d{8}|612\d{8}|613\d{8}|617\d{8}|618\d{8}|04\d{8}|614\d{8}|1300\d{6}|1800\d{6})(?!\d)
(我删除方括号,因为在尝试匹配单个字符时不需要它们)
答案 1 :(得分:1)
在使用正则表达式之前,请勿搜索/替换任何文本。这将使您的输入无法使用。试试这个:
(?:(?:\+?61 )?(?:0|\(0\))?)?[2378] \d{4}[ -]?\d{4}
答案 2 :(得分:0)
这个答案应该是评论,这不是因为我声誉不佳!
我已经看到你正在更新正则表达式,我认为这种变化可以帮助你。它应该匹配非常罕见的格式!
(\+61 )?(?:0|\(0\))?[2378] (?:[\s-]*\d){8}