前面的字符匹配条件

问题描述 投票:0回答:1

我正在创建一个正则表达式搜索查询,以检查带有前缀 conditions:

的电子邮件地址的有效性
  1. 允许的字符:字母 (a-z)、数字、下划线、句点和破折号。

  2. 下划线、句号或破折号后面必须跟一个或多个字母或数字

我已添加为

[\\_\\-\\.]*

re_string = '[a-zA-Z0-9]+[\\_\\-\\.]*@[a-zA-Z0-9]+[\\-]*\\.[a-z]{2,}'

但这只是搜索

[a-zA-Z0-9]+
之后的 0 个或多个字符实例,而不是整个搜索,并且不搜索前面的字母/数字字符。

如何将此条件添加到正则表达式中?

python regex email python-re
1个回答
0
投票

好的,如果会忽略@后面的部分,因为问题在前面并且它使正则表达式更短。 我还将删除双反斜杠,您应该使用 python 原始字符串作为正则表达式。因为它们没有转义序列,所以您不需要转义反斜杠。

最后有一个工作示例。


所以我们有以下内容:

[a-zA-Z0-9]+[\\_\\-\\.]*

稍微分解一下:

[a-zA-Z0-9]+
匹配尽可能多的字母数字字符,如果开头没有字母数字字符,则正则表达式应该失败。 (+ 匹配从 1 到 n 并且默认是贪婪的)

[\_\-\.]*
如果无人在场,则匹配尽可能多的下划线、破折号和点。

问题是,你不想这样做,你想匹配一个下划线,破折号或点(

[_\-.]
),然后至少一个字母数字(
[a-zA-Z0-9]+
)并且这整个部分应该是可选的(? ).

这意味着我们必须执行以下操作:

`re_string = r"[a-zA-Z0-9]+([_\-.][a-zA-Z0-9]+)@[a-zA-Z0-9]+-*\.[a-z]{2,}?"`

正如一些改进提示: 在这种形式中,您的正则表达式也与输入 [email protected] 这部分匹配:[email protected]。因此,如果您知道字符串中只有一个电子邮件地址,则应该调用 re.fullmatch 函数。如果你想过滤电子邮件地址,你应该附加一个正向的前瞻和一个正向的后向,以确保前面和后面有空格。 (如果字符串在电子邮件地址之后结束,则不匹配。

(?<=\s)[a-zA-Z0-9]+([_-.][a-zA-Z0-9]+)?@[a-zA-Z0-9]+-*.[a-z]{2,}(?=\s)

我已经完成的其他一些“改进”:

  1. 原始字符串 (\. -> .)
  2. 您不需要在字符类中转义下划线和点([_-.] -> [_-.]
  3. 一个字符不需要字符类 ([-] -> -)

至少有一件事我觉得有点奇怪:为什么@后面的部分中有-*部分我还没有找到对此的解释。 (只是为了澄清你只匹配@foo-------------.com之类的东西。当然你也匹配@foo.com,但我认为这是一个错误,这些例子都没有破折号。)

© www.soinside.com 2019 - 2024. All rights reserved.