澳大利亚电话号码的Python RegEx - 假阴性 - 同一子串中的2个匹配

时间:2018-01-26 23:23:30

标签: python regex

我正在尝试使用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 ...... AFRFast100Nov92017EXPLOREOUTWAREPortfolioInnovationWorkingatOutwareAboutSitemapCONNECTMELBOURNELevel3469LaTrobeStMelbourneVIC30​​00610386849912SYDNEYLevel41SmailStUltimoNSW2007610280647043"

现在,如果我将我的正则表达式应用于此字符串

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大师可以为此提供帮助。 : - )

请帮助!!

3 个答案:

答案 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}

https://regex101.com/r/1Q4HuD/3

答案 2 :(得分:0)

这个答案应该是评论,这不是因为我声誉不佳!

我已经看到你正在更新正则表达式,我认为这种变化可以帮助你。它应该匹配非常罕见的格式!

(\+61 )?(?:0|\(0\))?[2378] (?:[\s-]*\d){8}