【问题标题】:Matching email regex [closed]匹配电子邮件正则表达式 [关闭]
【发布时间】:2014-01-17 16:16:28
【问题描述】:

所以我正在尝试匹配此表单的电子邮件

a-b-c-@-d-e-.-e-f-g

我想出了这个正则表达式

(\w+(?=-))*-@-(\w+(?=-))*.(\w+(?=-))

为什么这不起作用?

【问题讨论】:

  • 不适用于哪个输入?
  • 我不确定您使用的 (?=-) 语法应该做什么。我猜你只是想要-?
  • 你可能想要这样的东西:[\w-]*-@-[\w-]*.[\w-]*
  • @RobinWinslow:这是一个前瞻性断言。这意味着 \w+ 应该只在后面跟着 - 时匹配,但不会匹配破折号本身。
  • @RobinWinslow 我意识到这一点,但我的目标是在这里进行教育——既然我们可以完全消除复杂的表达方式,为什么还要花时间提出复杂的表达方式?

标签: python regex


【解决方案1】:

您使用前瞻断言使事情变得过于复杂。任何环视断言都充当锚(匹配文本中的位置,而不是文本本身);就像^$ 匹配匹配文本的开头和结尾。

所以,(\w+(?=-) 匹配只是a- 文本中的a。在匹配文本之后是下一个字符,-!因此,(\w+(?=-)* 模式将与 a-b- 不匹配,因为其中的破折号不属于 \w 字符类。

使用组合字符类来代替\w - 字符,[\w-] 将所有 \w 匹配与一个额外字符 -

[\w-]*-@-[\w-]*\.[\w-]*

您可以使用this regex101 自行测试(其中包括对其工作原理的完整说明)。

将匹配您的输入。我假设你想在这里匹配 literal . 字符,所以我使用 \. 而不是 .,它几乎可以匹配任何东西。

您只需要显式匹配单个个单词字符,后跟一个破折号,重复,然后使用:

(?:\w-)*@-(?:\w-)*\.(?:-\w)*

此模式与您的尝试不同,因为它删除了 @ 之前的文字 -,并将最后一组中的 \w 之前的 - 移动。有关该模式的详细信息,请参阅regex101

【讨论】:

  • 那么这在 python 中有效吗?
  • 是的,我提供给您的 regex101 链接都设置为 python 模式。为什么,他们不为你工作?
  • 那些没有捕捉到,我不知道为什么会这样
  • @praks5432:输入什么?它们都与您提供的示例输入相匹配。
  • @praks5432:您使用什么方法来匹配您的输入? re.search()re.match()?
【解决方案2】:

如果您的目标是匹配一般的电子邮件地址,请试一试:https://github.com/madisonmay/CommonRegex

用法是这样描述的:

>>> from commonregex import CommonRegex
>>> parsed_text = CommonRegex("There's an some@email.com in this sentence.")
>>> parsed_text.emails
["some@mail.com"]

【讨论】:

    【解决方案3】:

    你可以使用:

    (\w|[-])*-@-(\w|[-])*.(\w|[-])*
    

    您的代码有问题:

    (?=-) 是 Positive Lookahead,它断言字符 - 字面上可以匹配。 它仍然会忘记当前的比赛。

    请参考 THIS

    【讨论】:

      【解决方案4】:

      假设您的要求符合这些规则:

      • 必须只有一个.和一个@
      • @. 的任一侧必须有一个- 目录
      • 整个字符串必须以字母开头和结尾
      • -s 只能分词,不能相邻

      那么我认为这可以解决问题:

      ^(\w+-)*\w+-@-(\w+-)*.(-\w+)*$

      http://regexr.com?381h6

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-09
        • 1970-01-01
        • 2017-07-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多