使用正则表达式从 python 中的自由格式文本中提取 phone 数字

Extracting phone numbers from a free form text in python by using regex

我必须从自由形式的文本中提取 phone 个数字。

如何在 python 中使用正则表达式来管理它?

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

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

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)

我怎样才能做到?

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

匹配 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()

您期待什么样的模式?

您必须构建一个模式才能将其与正则表达式匹配。 问题是您要查找的格式是什么?

要做到这一点,您应该研究 use-cases phone 数字的显示方式。

所以我希望您通过匹配 phone 个数字来定义您的意思。

  • 它是否是您正在寻找的特定格式,始终与自由文本保持一致?
  • 或者您可以通过国家代码 (+xx) 和特定位数来定义具有匹配 phone 数字的模式的字符串吗?

我的意思是两者之间存在巨大差异: - 我想匹配来自任何国家、手机或固定电话、任何格式的文本中的 phone 数字,其中包含随机 space 和 (,) 字符 要么 - 我想用 +xx(space)xxxxxxx(space) 格式匹配来自匈牙利的 phone 号码,这始终是一致的。

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

希望这段代码能起到很好的作用, V

所以我想我明白了你的问题。

这是我要按顺序执行的操作:

  • 了解什么是 reg-ex,如果没有基础知识,您只是在浪费我们和您自己的时间。
  • 看这个:https://www.youtube.com/watch?v=ZdDOauFIDkw
  • 写下你不知道的东西
  • 研究
  • 编写代码,为您的代码提供示例输入,将其复制到 http://pastebin.com,如果仍然无法正常工作,请展示给我们。
  • 重复。

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

text="""Matches 3334445555, 333.444.5555, 333-444-5555, 333 444 5555, (333) 444 5555 and all combinations thereof, like 333 4445555, (333)4445555 or 333444-5555. Does not match international notation +13334445555, but matches domestic part in +1 333 4445555."""

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

 >>> 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. 后面必须跟一个 1-9 之间的数字
  3. 它必须以 0-9 之间的数字结尾
  4. 中间可能包含0-9(space).-()