鱼C论坛

 找回密码
 立即注册
查看: 919|回复: 5

[已解决]关于re邮箱格式校验

[复制链接]
发表于 2023-8-22 12:44:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
以下是我使用re对邮箱格式合法性进行验证的代码:

re.search(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', receivers)

发现它对于含有两个@@的邮件地址如:xxx@@xx.xx 无能为力。

请问是什么原因?并请赐教完美的验证re代码!
最佳答案
2023-8-23 12:39:58
不知道你搞这么特殊有什么需求,不过规则是人家制定的,你这么搞也没有用啊。

"^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$"
这个是一个企业级的程序里copy出来的。
合法E-mail地址:
1. 必须包含一个并且只有一个符号“@”
2. 第一个字符不得是“@”或者“.”
3. 不允许出现“@.”或者.@
4. 结尾不得是字符“@”或者“.”
5. 允许“@”前的字符中出现“+”
6. 不允许“+”在最前面,或者“+@”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-22 12:44:59 | 显示全部楼层
问题出在正则表达式中的第一个部分 [a-zA-Z0-9._%+-]+ 。这个部分表示匹配一个或多个字母、数字、下划线、百分号、加号、减号、点号。然而,它并没有考虑到 @ 符号。

所以,当邮件地址中有两个 @ 符号时,正则表达式会匹配到第一个 @ 符号之前的部分,然后匹配到第二个 @ 符号之后的部分,而不会检查 @ 符号的数量是否正确。

为了解决这个问题,我们可以在正则表达式中添加对 @ 符号的检查。以下是一个修正后的正则表达式:

  1. re.search(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', receivers)
复制代码


这个正则表达式将会匹配一个或多个字母、数字、下划线、百分号、加号、减号、点号,接着是一个 @ 符号,然后是一个或多个字母、数字、减号、点号,最后是一个点号和两个或更多字母。

这样,正则表达式就可以正确地验证邮箱地址的格式了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-22 12:45:25 | 显示全部楼层
使用正则表达式进行邮箱格式校验时,您遇到的问题是由于正则表达式中的.匹配了除换行符外的任意字符,导致在匹配邮箱地址时,出现了多个@的情况。为了解决这个问题,可以使用非贪婪匹配方式,将.匹配改为[^@],表示匹配除@以外的任意字符。

以下是修正后的正则表达式:

  1. import re

  2. receivers = 'xxx@@xx.xx'
  3. pattern = r'[a-zA-Z0-9._%+-]+@[^@]+\.[a-zA-Z]{2,}'
  4. if re.search(pattern, receivers):
  5.     print('合法的邮箱地址')
  6. else:
  7.     print('非法的邮箱地址')
复制代码


这样,只有合法的邮箱地址才会通过验证。

值得注意的是,尽管使用正则表达式可以对大多数合法的邮箱地址进行基本的验证,但它并不能完全覆盖所有可能的邮箱格式。邮箱地址的规范非常复杂,并且会随着不同的邮件服务提供商而有所差异。因此,建议综合使用正则表达式和其他验证方法,以确保您的代码能够正确处理各种情况。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-22 12:49:12 | 显示全部楼层
isdkz 发表于 2023-8-22 12:44
问题出在正则表达式中的第一个部分 [a-zA-Z0-9._%+-]+ 。这个部分表示匹配一个或多个字母、数字、下划线、 ...

不好意思我没看出和原代码有什么区别,能再看看吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-8-22 21:37:51 | 显示全部楼层
问题出在正则表达式的模式中,它匹配了多个连续的 @ 符号。如果你要确保只有一个 @ 符号,你可以修改正则表达式的模式。以下是一个修改后的示例代码:
import re

email_pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
receivers = ['xxx@xx.xx', 'xxx@@xx.xx']

for receiver in receivers:
    if re.match(email_pattern, receiver) and receiver.count('@') == 1:
        print(f"{receiver} 是一个有效的邮箱地址")
    else:
        print(f"{receiver} 不是一个有效的邮箱地址")
在上述代码中,我使用了 re.match() 函数来确保整个字符串与正则表达式的模式匹配。然后使用 receiver.count('@') 来统计 @ 符号的数量,以确保只有一个 @ 符号。如果两个条件都满足,则认为是一个有效的邮箱地址。

这样修改后的代码应该可以解决你遇到的问题,并且能够正确验证邮箱地址的合法性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-23 12:39:58 | 显示全部楼层    本楼为最佳答案   
不知道你搞这么特殊有什么需求,不过规则是人家制定的,你这么搞也没有用啊。

"^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$"
这个是一个企业级的程序里copy出来的。
合法E-mail地址:
1. 必须包含一个并且只有一个符号“@”
2. 第一个字符不得是“@”或者“.”
3. 不允许出现“@.”或者.@
4. 结尾不得是字符“@”或者“.”
5. 允许“@”前的字符中出现“+”
6. 不允许“+”在最前面,或者“+@”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 15:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表