我正在创建一个正则表达式搜索查询,以检查带有前缀 conditions:
的电子邮件地址的有效性允许的字符:字母 (a-z)、数字、下划线、句点和破折号。
下划线、句号或破折号后面必须跟一个或多个字母或数字。
我已添加为
[\\_\\-\\.]*
:
re_string = '[a-zA-Z0-9]+[\\_\\-\\.]*@[a-zA-Z0-9]+[\\-]*\\.[a-z]{2,}'
但这只是搜索
[a-zA-Z0-9]+
之后的 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)
我已经完成的其他一些“改进”:
至少有一件事我觉得有点奇怪:为什么@后面的部分中有-*部分我还没有找到对此的解释。 (只是为了澄清你只匹配@foo-------------.com之类的东西。当然你也匹配@foo.com,但我认为这是一个错误,这些例子都没有破折号。)