为啥说我邮箱地址格式不对呢?

当您在一个网站或者客户端程序中,要注册一个新的用户时,网站或客户端程序可能会要求输入您的邮箱地址。也许您不想让网站或客户端程序知道您的邮箱地址,或者嫌输入麻烦,您会随便输入一段字符串,希望蒙混过关。可惜的是当您提交录入的注册信息时,网站或客户端程序会告知您输入的邮箱地址格式错误。网站或客户端程序是如何来判断您输入的邮箱地址格式是错误的呢?

原来是正则表达式在起作用

这就要说到正则表达式了,正则表达式可以使用一些预定义的字符、符号以及这些字符或符号的组合,组成一个规则串,然后使用这个规则串对需要处理的一段字符串进行匹配。如果这段字符串的内容和规则串能够匹配,则匹配成功,否则就匹配失败。正则表达式被经常使用在数据采集、搜索引擎、编译系统、文本编辑器等方面。

正则表达式是由一些预定义的字符以及这些字符组合而成的字符串。关于这些预定义的字符以及组合方式,暂时先不用全部了解其含义及用法,我们会在正则表达式的使用过程中,来逐步了解它们的含义及用法。

先来一个简单的正则表达式

假如您要使用Python开发一个用户注册程序,需要验证用户输入的邮箱地址格式是否正确,哪该怎么编写这个程序呢?

要验证邮箱地址的格式是否正确,需要先弄清楚邮箱地址的格式规则,有了邮箱地址的格式规则,就可以编写正则表达式了。观察邮箱地址,我们发现每个邮箱地址都包含“@”字符。

只有检测给出的邮箱地址是否包含“@”字符,就可以基本确定邮箱地址格式是否正确。如何判断一个字符串是否包含“@”字符呢?在Python语言中,可以使用成员运算符in来判断,不过在这里我们使用正则表达式来检测。

正则表达式就是一段字符串,这段字符串由一些预定义的字符、符号以及这些字符或符号组合而成。

我们先来认识预定义符号“[]”,这个符号是中括号,在中括号内可以包含一个或多个字符、符号构成的集合,当需要匹配的字符串包含中括号内的任意一个字符时,匹配就成功。

例如:匹配一个邮箱地址是否包含“@”符号,可以使用下面的正则表达式:

pattern = “[@]”

pattern是一个最简单的正则表达式,它使用了预定义的“[]”符号,在“[]”符号内包含一个“@”字符,使用该正则表达式可以匹配包含“@”字符的字符串,也可以用于检测邮箱地址是否包含“@”字符。

Python如何执行正则表达式?

Python提供了re模块用于执行正则表达式。re模块提供了两个主要的正则表达式执行函数,分别是match函数和search函数。match函数尝试从字符串的起始位置开始匹配,如果在起始位置匹配不成功的话,match函数返回None;search函数会扫描整个字符串,并返回第一个成功的匹配。

match函数和search函数都有三个相同的参数,参数如下表所示:

下面的代码使用match函数检测邮箱地址是否包含“@”字符,可以猜想一下,使用下面的代码能检测成功吗?

import re

# 正则表示式

pattern = "[@]"

# 使用re模块mach函数进行匹配

print(re.match(pattern, 'bianchen'))

上面的代码pattern是正则表达式,使用re模块的match函数匹配邮箱地址,验证邮箱地址是否包含“@”字符。前面说过,match函数尝试从字符串的起始位置开始匹配,如果在起始位置匹配不成功的话,match函数返回None。邮箱地址这个字符串起始位置不是“@”字符,因此会匹配失败,程序执行结果也是如此。下图是上述代码的执行结果:

再看下面的代码:

import re

# 正则表示式

pattern = "[@]"

# 使用re模块search函数进行查找

print(re.search(pattern, 'bianchen'))

在上面的代码中,使用了re模块的search函数。前面说过,search函数会扫描整个字符串,并返回第一个成功的匹配。因此使用search函数会匹配成功。下图是上述代码的执行结果:

这次要动真格的了,写一个比较复杂的正则表达式

search函数主要是应用正则表达式进行字符串查找操作,并不适合做验证邮箱地址格式的工作。我们还是要使用match函数进行邮箱地址格式的验证工作。

观察下面的邮箱地址:

bianchen

johy_1996820

89299001

每个邮箱地址都符合“名称@域名”规则,字符“@”在邮箱地址的“名称”和“域名”之间。进一步观察发现,邮箱地址名称只允许由英文字母、数字、下划线组成,当然现在也允许包含中文了,关于中文暂时不予考虑;域名只允许由英文字母、数字、下划线、“.”组成。

基于上述观察,在写正则表达式时,可以在符号“@”前面匹配任意多个符合邮箱名称规则的字符和符号,在符号“@”后面匹配任意多个符合邮箱域名规则的字符和符号。

下面给出的正则表达式可以验证邮箱地址格式的正确性:

pattern = "\w+[@][a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)"

这段正则表达式比前面的正则表达式复杂了许多,是不是感觉不太容易理解,这一长串字符和符号的组合都有什么含义呢?

首先,我们以字符串“[@]”为分隔串将正则表达式分为两部分。

第一部分是:

“\w+”

第二部分是:

“[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)”

第一部分是匹配邮箱名称,前面说过邮箱名称由英文字母、数字、下划线组成。在正则表达式中,使用“\w”来匹配数字、字母和下划线,“\W”来匹配非数字、字母和下划线。

类似于“\w”、“\W”这种字符组合在正则表达式中也称为元字符,前面介绍的“[]”也是正则表达式的元字符,元字符使正则表达式具有处理能力。例如:“\w”元字符可以让正则表达式具备匹配数字、字母和下划线的能力。

元字符“\w”仅匹配单个数字、字母和下划线,如果需要匹配多个数字、字母和下划线,就需要用到正则表达式的元字符“+”,元字符“+”可以让前面的字符或子表达式匹配一次或多次。例如:“\w+”子表达式就具备匹配一个或多个数字、字母和下划线的能力。

第二部分是匹配邮箱域名,邮箱域名由英文字母、数字、下划线、“.”组成,和邮箱名称的构成基本相同。域名结构分为前缀和后缀两部分,在前缀和后缀之间用“.”分隔。 “[a-zA-Z0-9_-]”表示匹配’a’-‘z’范围内的小写字母、’A’-‘Z’范围内的大写字母、数字0-9、下划线。“[a-zA-Z0-9_-]”等同于元字符“\w”。“[a-zA-Z0-9_-]+”等同于“\w+”。

“(\.[a-zA-Z0-9_]+)”是子表达式,子表达式内容使用一对小括号括起来,一对小括号也是正则表达式的元字符。括号内的“\.”用于匹配邮箱域名的“.”,其中元字符“\”是转义元字符,它把元字符后面的字符标记为特殊字符、文本等。例如:“\.”匹配单符号“.”,“\n”匹配单字符“n”。“[a-zA-Z0-9_]+”就不用解释了。

在Python代码编辑器输入下面的代码:

import re

# 正则表示式

pattern = "\w+[@][a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)"

# 使用re模块mach函数进行匹配

print(re.match(pattern, 'bianchen'))

程序执行结果是匹配成功,如下图所示:

判断邮箱地址格式还有点小问题

修改一下上面的代码:

import re

# 正则表示式

pattern = "\w+[@][a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)"

# 使用re模块mach函数进行匹配

print(re.match(pattern, 'bianchen'))

在上面的代码中,需要验证的邮箱地址域名分为一级和二级域名,执行程序看上面的代码是否还能匹配成功。执行结果如下图所示:

从执行结果可以看出,邮箱地址并没有完全匹配。问题在于“(\.[a-zA-Z0-9_]+)”仅匹配一次域名的后缀,如果邮箱域名有多个域名后缀则只能匹配最前面一个。要解决这个问题,就需要“(\.[a-zA-Z0-9_]+)”重复匹配一次或多次,前面说过,正则表达式的元字符“+”可以让前面的字符或子表达式匹配一次或多次,在“(\.[a-zA-Z0-9_]+)”后面添加元字符“+”,就可以实现重复匹配一次或多次。修改上面的代码:

import re

# 正则表示式

pattern = "\w+[@][a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)+"

# 使用re模块mach函数进行匹配

print(re.match(pattern, 'bianchen'))

执行结果如下图所示:

从执行结果可以看出,邮箱地址匹配成功。

小结一下文中正则表达式用到的元字符和文本字符

小结一下验证邮箱格式用到的正则表达式中的元字符和文本字符。

元字符

文本字符

python邮箱格式验证_学会使用正则表达式——验证邮箱地址格式相关推荐

  1. mysql 邮箱格式的_正则表达式验证邮箱格式

    var usersEmail=document.getElementById("usersEmail").value; var Expression = /^[_A-Za-z0-9 ...

  2. php验证电子邮件格式是否正确,验证邮箱格式是否正确(非正则验证)

    > 验证邮箱格式是否正确(非正则验证) ``` function check_email($email){ $result = trim($email); if(filter_var($resu ...

  3. php7判断邮箱格式是否正确,利用php实现验证邮箱格式是否正确

    验证邮箱格式是否正确可以通过filter_var函数来实现. 函数介绍: filter_var() 函数通过指定的过滤器过滤一个变量. 语法:filter_var(variable, filter, ...

  4. html验证座机号码_使用JavaScript正则表达式验证电话、手机号码

    使用 JavaScript 正则表达式验证电话.手机号码 电话手机号码正则表达式 (支持手机号码, 3-4 位区号, 7-8 位直播号码, 1 - 4 位分机号) ((\d{11})|^((\d{7, ...

  5. gmail注册手机号不能用于验证_一个手机号码、辅助邮箱,可以注册绑定多少个gmail帐号?...

    点击上方云中栖居关注 ▲ 先说答案,据Google专家回复, 一个手机号码最多绑定10个Google帐号. 之前每当有喜欢的邮箱名称,就会注册一个谷歌邮箱帐号,应该有二十多个了吧,丢弃了一些,目前仅在 ...

  6. java 正则表达式 邮编_使用Java正则表达式验证邮政编码

    为了使用正则表达式匹配邮政编码,我们在Java中使用matchs方法.java.lang.String.matches()方法返回一个布尔值,该值取决于String与正则表达式的匹配. 声明-java ...

  7. java 姓 名字_使用Java正则表达式验证名字和姓氏

    为了使用正则表达式匹配名字和姓氏,我们在Java中使用matchs方法.java.lang.String.matches()方法返回一个布尔值,该值取决于String与正则表达式的匹配. 声明-jav ...

  8. php 自动验证 正则表达,使用正则表达式验证登录页面的输入内容

    这篇文章主要介绍了使用正则表达式验证登录页面输入是否符合要求的实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下 先给大家展示下效果图: 废话不多说了,直接给大家贴代码了,具体代码如下所示: ...

  9. 电子邮箱格式怎么写?你知道电子邮箱格式都有哪些吗?

    邮箱格式怎么写?如今电子邮箱的需求量一直呈持续增长趋势,而这其中QQ邮箱.TOM VIP邮箱.网易邮箱等是目前极为主流的邮箱,而不同的邮箱后缀是不同的,比如163.net.163vip.com.mai ...

  10. java正则表达式验证端口号_JS正则表达式验证端口范围(0-65535)

    javascript正则表达式验证IP地址的端口合法性 if (!(/^[1-9]\d*$/.test(port) && 1 <= 1 * port && 1 * ...

最新文章

  1. html手机怎么样删除掉,怎么样才能删除这个叫做(手机模拟器大师)的软件?...
  2. 如何禁用Visual Studio 2013的Browser Link功能
  3. java抓新闻_【图片】【抓取】Java获取各大网站新闻【java吧】_百度贴吧
  4. python条形堆积图_python – 使用DataFrame.plot显示堆积条形图中...
  5. 微软从 Engine Yard 手中收购容器平台 Deis
  6. vmVare使用NAT模式-配置详情
  7. 手机组态软件 APP监控台达PLC C#全套源代码,C#开发上位机手机APP
  8. windows系统注册dll文件
  9. tomcat配置前台访问日志记录
  10. apdu 移动sim_做移动sim卡读写程序, 用APDU指令, 怎么给白卡写入iccid和IMSI?
  11. mac vs 返回上一步_mac 后退一步 快捷键
  12. sin函数对照表_三角函数数值对照表.pdf
  13. python画成绩正态分布图_R统计学(09): 正态分布 (二)
  14. 02、RabbitMQ之交换机
  15. Linux软件安装失败问题,source.list用了bionic,实际上我的Linux是focal版本
  16. 电脑摄像头未能创建连接服务器,电脑提示未能创建视频预览,请检查设备连接的原因及解决办法...
  17. ArcGIS教程:什么是ArcGIS中的报表
  18. <<多模态预训练—泛读>>2022:BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Unders
  19. Qt moc: Too many input files specified
  20. 这可能是目前最方便的网站中英文切换(理论支持所有语言)

热门文章

  1. 梧桐计划发布!百度智能云携手合作伙伴共创“云智一体”繁荣新生态
  2. Android客户端与服务器通信
  3. 高级前端面试100问(必会)
  4. 字节前端实习一面面经
  5. SM2/RSA证书工具--简单CA实现
  6. php队列处理mysql_php队列处理:php消息队列实现原理(图文)
  7. 为什么WiFi自动信道选到的信道多数在1/6/11
  8. 魔趣9上手体验(坚果pro2)
  9. android app icon素材,史上最全的APP图标模板素材以及设计格式最全的
  10. Android手机使用笔记本流量上网(基于Android便携式WLAN热点)