我有9种电子邮件模式。我期望:
- myname@domainemail.com
- my.name@domainemail.com
- my.name1@domainemail.com
- my_name.1@domainemail.com是有效的电子邮件
和
- my-name@domainemail.com
- my.name.1@domainemail.com
- domainname.1@domainemail.com
- 1myname@domainemail.com
- 1.myname@domainemail.com不是有效的电子邮件
然后,我制作了正则表达式的脚本,如:
regex = r"(^[a-zA-Z_]+[.]?[a-z0-9]+)@([w.]+.[w.]+)$"
但是,电子邮件domainname.1@domainemail.com仍然有效。
如何制作正确的模式regex,使电子邮件变得无效,并且所有的电子邮件模式都符合我的期望?
对于示例数据,您可以将可选部分与下划线匹配,其中允许在@之前加一个点和一个数字
或者你匹配一个在@之前有一个点和一个字符a-z的零件
^[a-zA-Z]+(?:(?:_[a-zA-Z0-9]+)+.[A-Za-z0-9]+|.[a-zA-Z][a-zA-Z0-9]*)?@(?:[a-zA-Z0-9]+.)*[a-zA-Z0-9]{2,}$
解释
^
字符串开始[a-zA-Z]+
匹配1+次字符a-z(?:
非捕获组(?:_[a-zA-Z0-9]+)+
在下划线后重复1次以上,后跟字符a-z或数字0-9.[A-Za-z0-9]+
匹配一个点和1个以上字符a-z或数字0-9|
或.[a-zA-Z][a-zA-Z0-9]*
匹配一个点和一个单个字符a-z以及0+个字符a-z或数字
)?
关闭组并使其可选@
按字面匹配(?:[a-zA-Z0-9]+.)*
重复0次以上a-z0-9,后跟一个点[a-zA-Z0-9]{2,}
匹配a-z0-9 2次或更多次$
字符串结束
Regex演示
使用以下带有gmi
标志的正则表达式模式:
^[a-z]+(?:(?:.[a-z]+)+d*|(?:_[a-z]+)+(?:.d+)?)?@(?!.*..)[^W_][a-zd.]+[a-zd]{2}$
https://regex101.com/r/xoVprE/4