Python基础(26) - 如何提取电话号码中的区号,电话号码及分机号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础(26) - 如何提取电话号码中的区号,电话号码及分机号相关的知识,希望对你有一定的参考价值。

参考技术A 加油 2020-3-4

如何改进正则表达式来提取电话号码?

【中文标题】如何改进正则表达式来提取电话号码?【英文标题】:How to improve regular expression to extract phone numbers? 【发布时间】:2018-05-26 16:40:17 【问题描述】:

我正在尝试使用正则表达式从网络链接中提取电话号码。我面临的问题是不需要的 id 和网页的其他元素。如果有人可以提出一些改进建议,那将非常有帮助。下面是我在 Python 中使用的代码和正则表达式,

from urllib2 import urlopen as uReq
uClient = uReq(url)
page_html = uClient.read()
print re.findall(r"(\(?\d3\D0,3\d3\D0,3\d4).*?",page_html)

现在,对于大多数网站来说,脚本会获取一些页面元素值并且有时是准确的。请建议对表达式进行一些修改

re.findall(r"(\(?\d3\D0,3\d3\D0,3\d4).*?",page_html)

对于不同的 url,我的输出如下所示

http://www.fraitagengineering.com/index.html
['(877) 424-4752']
http://hunterhawk.com/
['1481240672', '1481240643', '1479852632', '1478013441', '1481054486', '1481054560', '1481054598', '1481054588', '1476820246', '1481054521', '1481054540', '1476819829', '1481240830', '1479855986', '1479855990', '1479855994', '1479855895', '1476819760', '1476741750', '1476741750', '1476820517', '1479862863', '1476982247', '1481058326', '1481240672', '1481240830', '1513106590', '1481240643', '1479855986', '1479855990', '1479855994', '1479855895', '1479852632', '1478013441', '1715282331', '1041873852', '1736722557', '1525761106', '1481054486', '1476819760', '1481054560', '1476741750', '1481054598', '1476741750', '1481054588', '1476820246', '1481054521', '1476820517', '1479862863', '1481054540', '1476982247', '1476819829', '1481058326', '(925) 798-4950', '2093796260']
http://www.lbjewelrydesign.com/
['213-629-1823', '213-629-1823']

我只想要(000) 000-0000 (not that I have added space after parenthesis),(000)-000-0000or000-000-0000` 格式的电话号码。任何建议表示赞赏。请注意,我已经参考了这个链接:Find phone numbers in python script

我需要改进正则表达式以满足我的特定需求。

【问题讨论】:

这个答案可能会有所帮助:***.com/questions/3868753/… 【参考方案1】:

以下正则表达式可用于匹配您提供的样本和其他类似数字:

(\([0-9]3\)[\s-]?|[0-9]3-)[0-9]3-[0-9]4

除了使用正则表达式之外,以下示例脚本可用于测试正负案例:

import re

positiveExamples = [
    '(000) 000-0000',
    '(000)-000-0000',
    '(000)000-0000',
    '000-000-0000'
]
negativeExamples = [
    '000 000-0000',
    '000-000 0000',
    '000 000 0000',
    '000000-0000',
    '000-0000000',
    '0000000000'
]

reObj = re.compile(r"(\([0-9]3\)[\s-]?|[0-9]3-)[0-9]3-[0-9]4")

for example in positiveExamples:
    print 'Asserting positive example: %s' % example
    assert reObj.match(example)

for example in negativeExamples:
    print 'Asserting negative example: %s' % example
    assert reObj.match(example) == None

【讨论】:

【参考方案2】:

如果您只能搜索网页的纯文本,您可以完全避免在 ids、其他属性或 HTML 标记内进行搜索。可以通过BeautifulSoup HTML parser处理网页内容来实现:

from urllib2 import urlopen as uReq

from bs4 import BeautifulSoup

page_text = BeautifulSoup(uReq(url), "html.parser").get_text()

然后,正如 Jake 在 cmets 中提到的,你可以让你的正则表达式更可靠:

Find phone numbers in python script

【讨论】:

以上是关于Python基础(26) - 如何提取电话号码中的区号,电话号码及分机号的主要内容,如果未能解决你的问题,请参考以下文章

java中如何提取一个字符串中的电话号码?

Python实践练习:电话号码和 E-mail 地址提取程序

如何从 Android 中的 Vision OCR 结果文本中提取姓名、电话号码和电子邮件地址?

使用Python进行名片OCR(识别姓名,职务,电话,Email邮箱)

如何从zapier中的电子邮件中提取字符串?

Python基础练习-004-提取字符串中的特定字符