所以我正在尝试匹配此表单的电子邮件
a-b-c-@-d-e-.-e-f-g
我想出了这个正则表达式
(\w+(?=-))*-@-(\w+(?=-))*.(\w+(?=-))
为什么不起作用?
答案 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)
答案 3 :(得分:0)
假设您要求遵守这些规则:
.
和一个@
-
和@
.
目录
-
必须只分开单词,永远不要彼此相邻然后我认为这会解决问题:
^(\w+-)*\w+-@-(\w+-)*.(-\w+)*$