正则表达式实践练习

通过这些例子的练习,除了可以掌握常用的正则表达式,更能够巩固前面所学知识。

同样一个功能的正则表达式,你可能会搜索到很多写法,具体使用哪个,还是要根据实际需求来定,厘清想要匹配的字符串的规则是解决问题的关键,有了规则,才能写出正则表达式。

1. 匹配中文

目标字符串是

匹配一段中文,this is a book ,非中文部分不要

如果指向匹配中文部分,标点符号和其他字符都不要,正则表达式可以写成

[\u4e00-\u9fa5]+

最终会匹配到两段中文

匹配一段中文
非中文部分不要

\u4e00 这种写法是unicode,在\u4e00 与 \u9fa5 之间,都是中文字符。

2. 匹配邮箱

先考虑规则,邮箱分为两部分,A@B,A部分是邮箱用户名部分,可以由大小写字母,数字,下划线,中划线构成。

B是域名部分,域名通常都是xxx.xxx的形式,那么根据实际工作中的需要,可以继续细化,域名的前半部分只能由小写字母和数字构成,后半部分只能是com,根据这些规则写出正则表达式

^[a-zA-Z0-9_-]+@[a-z0-9]+.com$

可以使用以下邮箱对这个正则表达式进行验证

1. pythonlinks@163.com
2. 3984245@qq.com
3. python-001@gmail.com

3. 匹配身份证号

以二代身份证为例,身份证号码是18位,最后一位可以是数字,也可以是大写的X,实际使用中为了防止大小写问题,还会加上x是小写的情况,前17位就全部由数字构成

^\d{17}(X|x)$

这个正则表达式当然可以用来匹配身份证号,但还有一个更好的写法

^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X|x)$

这种写法,就考虑到了身份证的编码规则

  • 前6位是地址码, 登记户口时所在地的行政区划代码
  • 7到14位是出生年月日
  • 15到17位是顺序码,给同年同月同日出生的人编制的顺序码,第17位奇数表示男性,偶数表示女性
  • 第18位是校验码

当我们使用程序进行正则匹配时,小括号内的子表达式所匹配的内容可以通过程序返回结果,这样,就可以按照身份证的编码规则对身份证进行分割

import re

content = '221282198608228771'
pattern = re.compile('^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X|x)$')

res = pattern.findall(content)
print(res)

程序输出结果

[('221282', '1986', '08', '22', '877', '1')]

4. 匹配URL

先来看看常见的url

https://www.baidu.com/
http://docs.jinkan.org/docs/flask/quickstart.html#
ftp://foolish.6600.org

:// 之前是协议说明部分,http协议是最常见的协议,此外还有ftp,thunder 协议,比如迅雷经常使用的资源地址都是以 thunder:// 开头的

://后面的部分的构成则比较复杂,除了空格之外,其他的字符都可以

了解了url构成后,我们可以写出匹配url的正则表达式

[a-zA-z]+://[^\s]*

5. QQ号码

先来看qq号码的规则,目前,qq号码最长可以是11位,最短是5位,首位不能是0,根据这个规则写出正则表达式

[1-9][0-9]{4,10}

第一位是1到9中的任意一个,后面的数字部分长度可以是4位到10位

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案