如何在python中使用正则表达式匹配可选的完整电话号码

如何在python中使用正则表达式匹配可选的完整电话号码,python,regex,Python,Regex,这是我第一次在经过长时间的搜索后在这里询问解决方案,我想告诉你,从现在起,我一直在为我的具体案例努力寻找解决方案,或者我错过了,但至少我会为你提供你需要的所有信息。我已经找到并阅读了许多可能的方法来解决我的python正则表达式,但我只找到了用于孤立数字、字符或符号的正则表达式,而不是用于简单特定格式的整个电话号码 我将把文本的内容格式放在这里,我试图从中提取姓名、他们的电话号码和电子邮件地址(很抱歉没有格式化,但我不知道如何在代码区换行): 很多文字。。。名字1 0723-111-222ema

这是我第一次在经过长时间的搜索后在这里询问解决方案,我想告诉你,从现在起,我一直在为我的具体案例努力寻找解决方案,或者我错过了,但至少我会为你提供你需要的所有信息。我已经找到并阅读了许多可能的方法来解决我的python正则表达式,但我只找到了用于孤立数字、字符或符号的正则表达式,而不是用于简单特定格式的整个电话号码

我将把文本的内容格式放在这里,我试图从中提取姓名、他们的电话号码和电子邮件地址(很抱歉没有格式化,但我不知道如何在代码区换行):

很多文字。。。名字1 0723-111-222email@address1.com…大量文本
很多文字。。。第二个名字2 0723-333-444…大量文本
很多文字。。。第三名3email@address3.com…大量文本
很多文字。。。第四名4 0723-777-888email@address4.com…大量文本
很多文字。。。第五名5 0723-999-000email@address5.com…大量文本

我想提取的文本序列如下
First Name1 0723-111-222email@address1.com
等等。现在我有一个正则表达式,它实际上成功地实现了这一点,但有一个例外。正如您在上面的文本示例中所看到的,我还有一个字符串没有电子邮件地址,另一个字符串没有电话号码。因此,成功提取了没有电子邮件地址的字符串,但没有提取缺少电话号码的字符串,并且脚本输出中没有打印

我运行的正则表达式是这样的,我很快就能得到我想要的:

“\w+s?\w+s?\w++\s\w++\s(?:\d+\-\d+\-\d+)\s(?[A-Za-z0-9\.-++\.*]+[A-z0-9\.-+++\.[A-z]+)”

运行脚本后,输出如下所示:

名字1 0723-111-222email@address1.com
第二个名字2 0723-333-444
第四名4 0723-777-888email@address4.com
第五名5 0723-999-000email@address5.com

因此,主要问题是正则表达式的
(?:\d+\-\d+\-\d+)
序列没有打印
第三个名称3email@address3.com
在输出中。在缺少电话号码的情况下,我需要向正则表达式添加哪些可选内容

抱歉,我的描述太长,但我想提供足够的信息让您了解问题所在

您可以使用

\w+\s+\w+(?:(?:\s\d+-\d+-\d+)\s+[A-Za-z0-9.+\u*-]+@[A-z0-9.+\u-]+\.[A-z]+\s\d+-\d+-\d+]

该模式基本上遵循以下逻辑:
(可选的电子邮件号码)

细节

  • \w+\s+\w+
    -一个或多个单词字符、一个或多个空格以及一个或多个单词字符(两个空格分隔的“单词”)
  • (?:
    -启动非捕获组:
    • (?:\s\d+-\d+-\d+)\s+[A-Za-z0-9.+\*-]+@[A-z0-9.+\[[A-z]+
      -可选出现空格、一个或多个数字、
      -
      、一个或多个数字、
      -
      、一个或多个数字,然后出现一个或多个空格、一个或多个字符ASCII字母、数字、
      +
      *
      -
      字符、
      、一个或多个ASCII小写字母l字母、数字、
      +
      -
      字符、
      和一个或多个小写ASCII字母
    • |
      -或
    • \s\d+-\d+-\d+
      -空白,一个或多个数字,
      -
      ,一个或多个数字,
      -
      ,一个或多个数字
  • -非捕获组结束
注:

  • 要匹配一个或多个空白,请始终在
    \s
    之后添加
    +
    (当前模式中不是这种情况)
  • 电子邮件匹配模式可能需要进一步微调,请参阅

您提供的正则表达式正在工作,现在将打印不带电话号码的字符串。非常感谢您的快速回答和解释!