澳大利亚电话号码的 Python RegEx - 漏报 - 同一子字符串中有 2 个匹配项

标签 python regex

我正在尝试使用 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”匹配的“NS​​W2007610280647043”的第一部分,所以它不匹配“0280647043”,它也是同一子字符串的一部分

我实际上并不介意误报(即得到“0761028064”),但我确实需要解决误报(即没有得到“0280647043”)

我知道这里有一些正则表达式专家可以提供帮助。 :-)

请帮忙!!

最佳答案

在使用正则表达式之前不要搜索/替换任何文本。这将使您的输入无法使用。试试这个:

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

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

关于澳大利亚电话号码的 Python RegEx - 漏报 - 同一子字符串中有 2 个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48470964/

相关文章:

python - GQL:多值属性的不相等过滤器

python - 如果键不在 some_dict 中,为什么 some_dict ['key' ] = somevalue 起作用?

python - 用于 Python/Django 持续集成的 TeamCity

regex - 如何匹配任何两个不为零的数字的正则表达式?

regex - 为什么这个正则表达式不能与 grep 一起使用?

php - Javascript 正则表达式到 PHP

python - sort_values 和 sort_index 有什么区别?

python - Pandas - 行之间的比率

java - Android/Java 中删除\b

php - 如何匹配 [...] 的正则表达式模式