【问题标题】:Extract phone numbers from email using python 2.7 regex使用 python 2.7 正则表达式从电子邮件中提取电话号码
【发布时间】:2017-09-20 15:58:27
【问题描述】:

我正在尝试从许多电子邮件文件中提取电话号码。我编写了正则表达式代码来提取它们,但我只得到了一种格式的结果。

PHONERX = re.compile("(\d{3}[-\.\s]??\d{3}[-\.\s]??\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]??\d{4}|\d{3}[-\.\s]??\d{4})")

phonenumber = re.findall(PHONERX,content)

当我查看数据时,我发现电话号码有多种格式。

如何将具有这些格式的所有电话号码一起提取:

800-569-0123
1-866-523-4176
(324)442-9843
(212) 332-1200
713/853-5620
713 853-0357
713 837 1749

此链接是数据集的示例。问题是有时电话号码正则表达式从 messageId 和电子邮件中的其他号码中提取 https://www.dropbox.com/sh/pw2yfesim4ejncf/AADwdWpJJTuxaJTPfha38OdRa?dl=0

【问题讨论】:

标签: python regex


【解决方案1】:

您不需要使用逻辑 OR 来包含所有可能性。您可以使用以下正则表达式:

(?:\(\d+\)\s?\d*|\d+)([-\/ ]\d+){1,3}

Demo

若要与re.findall() 一起使用,请使用非捕获组:

(?:\(\d+\)\s?\d*|\d+)(?:[-\/ ]\d+){1,3}

【讨论】:

  • 我试过了,但我没有得到秋季电话号码的结果。我得到的结果看起来像这样 phonenumber=['14', '-7796', '-3490'])
  • @Ash 那是因为re.findall 会给你捕获组的结果。如果您想获得整个比赛,您需要通过添加?: 来使用非捕获组。查看更新。
  • 我刚刚用我正在使用的代码修改了这个问题,我会再试一次,谢谢
  • 您的代码看起来很完美,就像我在演示中看到的那样,但我不明白为什么它对我不起作用。我认为是因为数据集包含许多电子邮件文件。谢谢
【解决方案2】:

您可能想使用:

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

这将匹配您的所有示例 + 忽略误报,例如:

113 837 1749
222 2222 22222

Regex Demo and Explanation

Python Demo

【讨论】:

  • 你能定义no result吗?两个演示都按预期工作。你有什么错误吗?
  • 我应该在哪里使用这个re.DOTALL | re.MULTILINE PHONERX = re.compile("(?(?:1-)?\b[2-9][0-9]{2})?[-./]?[2-9][0- 9]{2}[-.]?[0-9]{4}\b") phonenumber = re.findall(PHONERX,content, re.DOTALL | re.MULTILINE)
  • 您可以使用来自ideone.com/A8RQcC 的代码,它可以按预期工作。
  • 谢谢你的回答。它在您的示例中完美运行,但不适用于我。我不知道为什么。我想是因为我从许多电子邮件文件中提取
  • 我可能知道发生了什么事,您可以发布电子邮件来源的示例吗?还请包括标题。您的正则表达式适用于哪种电话形式?
猜你喜欢
  • 2017-09-20
  • 2022-06-14
  • 2014-01-27
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多