匹配电子邮件正则表达式

时间:2014-01-17 07:48:44

标签: python regex

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

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

我想出了这个正则表达式

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

为什么不起作用?

4 个答案:

答案 0 :(得分:3)

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

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

使用组合字符类,允许\w -个字符,[\w-]将所有\w个匹配项与额外字符相结合,-

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

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

会匹配您的输入。我假设你想在这里匹配文字 .字符,所以我使用的是\.而不仅仅是.,它几​​乎可以匹配任何内容。

您需要明确匹配单个单词字符后跟短划线,重复,然后使用:

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

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

答案 1 :(得分: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"]

答案 2 :(得分:0)

您可以使用:

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

您的代码存在问题:

(?=-)是肯定的前瞻,断言字符-字面上可以匹配。 它会忘记当前的比赛。

参考 THIS

答案 3 :(得分:0)

假设您要求遵守这些规则:

  • 必须只有一个.和一个@
  • -@
  • 的任意一侧必须有.目录
  • 整个字符串必须以字母开头和结尾
  • -必须只分开单词,永远不要彼此相邻

然后我认为这会解决问题:

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

http://regexr.com?381h6