使用正则表达式从python中的自由格式文本中提取电话号码

时间:2015-12-30 10:44:08

标签: python regex phone-number

我必须从免费形式的文本中提取电话号码。

如何在python中使用reg-ex来管理它?

我找到一个是为了提取电子邮件地址。 https://gist.github.com/dideler/5219706

我使用电话号码正则表达式而不是电子邮件地址正则表达式实现了相同的方法,但我无法获得输出。

def get_phoneNumber(text):
        phone_number = ""
        regex = re.compile("((\(\d{3,4}\)|\d{3,4}-)\d{4,9}(-\d{1,5}|\d{0}))|(\d{4,12})")

        for phoneNumber in get_phoneNumbers(text, regex):
                phone_number = phone_number + phoneNumber + "\n"

        return phone_Number

def get_phoneNumbers(s, regex):
        return (phoneNumber[0] for phoneNumber in re.findall(regex, s)

我怎样设法做到这一点?

4 个答案:

答案 0 :(得分:3)

此正则表达式匹配来自北美的典型电话号码

匹配3334445555,333.444.5555,333-444-5555,333 444 5555,(333)444 5555及其所有组合,如333 4445555,(333)4445555或333444-5555。 不符合国际标记+13334445555,但匹配国内部分+1 333 4445555。

\(?\b[2-9][0-9]{2}\)?[-. ]?[2-9][0-9]{2}[-. ]?[0-9]{4}\b

来源:RegexBuddy

以下Python代码遍历所有匹配

for match in re.finditer(r"\(?\b[2-9][0-9]{2}\)?[-. ]?[2-9][0-9]{2}[-. ]?[0-9]{4}\b", subject):
    # match start: match.start()
    # match end (exclusive): match.end()
    # matched text: match.group()

您期待什么样的模式?

答案 1 :(得分:3)

您必须构建一个模式才能将其与regexp匹配。 问题是你要找的格式是什么?

为了能够做到这一点,你应该对用例如何显示电话号码进行一些研究。

因此,我希望您通过匹配电话号码来定义您的意思。

  • 它是您要查找的特定格式,通过自由文本始终保持一致吗?
  • 或者,您可以使用与电话号码匹配的模式,国家/地区代码(+ xx)以及特定的数字位数来定义字符串吗?

我只是说两者之间存在巨大差异: - 我想匹配来自任何国家,移动电话或固定电话的文本中的电话号码,任何格式,随机空格和(,)字符 要么 - 我希望匹配匈牙利的电话号码,+ xx(空格)xxxxxxx(空格)格式,始终保持一致。

要点: 为了能够使用正则表达式构建模式并使用它来匹配文本中的所有电话号码,您必须了解不同的表示形式,这意味着您期望电话号码看起来像什么。如果您的模式不正确,您可能会错过很多电话号码。

希望这段代码有充分的理由, V

答案 2 :(得分:3)

这应该找到给定字符串中的所有电话号码,包括国际号码。以@buckley为例,让我们使用字符串

text ="""匹配3334445555,333.444.5555,333-444-5555,333 444 5555,(333)444 5555及其所有组合,如333 4445555,(333 )4445555或333444-5555。不符合国际标记+13334445555,但匹配国内部分+1 333 4445555。"""

re.findall(r' +?(?[1-9] [0-9 .-()] {8,} [0-9]',text)

 >>> re.findall(r'[\+\(]?[1-9][0-9 .\-\(\)]{8,}[0-9]', text)
['3334445555', '333.444.5555', '333-444-5555', '333 444 5555', 
 '(333) 444 5555', '333 4445555', '(333)4445555', '333444-5555', 
 '+13334445555', '+1 333 4445555']

基本上,正则表达式列出了这些规则

  1. 匹配的字符串可以以+或(符号
  2. 开头)
  3. 必须跟随1-9之间的数字
  4. 必须以0-9
  5. 之间的数字结尾
  6. 中间可能包含0-9(空格).-()。

答案 3 :(得分:0)

所以我认为我对你的问题有所了解。

这就是我要按顺序做的事情:

  • 了解reg-ex是什么,没有基础知识,只是在浪费我们和你自己的时间。
  • 观看此内容:https://www.youtube.com/watch?v=ZdDOauFIDkw
  • 写下你不知道的内容
  • 研究
  • 编写代码,为您的代码提供示例输入,将其复制到http://pastebin.com,并将其显示给我们,如果它仍无效。
  • 重复。