Python正则表达式(regular expression)简介-re模块

              Python正则表达式(regular expression)简介-re模块

                                      作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

  就其本质而言,正则表达式(或RE模块)是一种小型的,高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过re模块实现。正则表达式模式被编译成一系列的字节码,然后由C编写的匹配引擎执行。

 

前言:

  如果让你匹配一下以“13|14|15|17|18”开头的电话号码你会怎么写呢?可能你会说这个很简单啊,几行代码搞定,不信你看:

1 PhoneNumber = input("You telephone number is >>>")
2 if PhoneNumber.isdigit() and len(PhoneNumber) == 11 and PhoneNumber.startswith("13")\
3     or PhoneNumber.startswith("15") or PhoneNumber.startswith("14") \
4     or PhoneNumber.startswith("17") or PhoneNumber.startswith("18") :
5     print("电话号码合法")
6 else:
7     print("sorry,电话号码不合法!")

  你这样写的话可以实现功能,但是看起来很low,如果让你匹配的字符串较多的话这种写法就不是很好了,我们可以用正则表达式来帮我们来解决这个问题,不信你看:

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 import re
 8 
 9 PhoneNumber = input("You telephone number is >>>")
10 if re.match('^(13|14|15|17|18)[0-9]{9}$',PhoneNumber):
11     print("电话号码合法")
12 else:
13     print("sorry,电话号码不合法!")

  写了三行的代码竟然用一行就可以搞定了,是不是绝对很高大上呢?其实,正则的功能我这个小案例只是展示了冰山一角。它的用处在每个语言都是有设计的,好了接下里让我们系统的学习一下正则表达式把。

 

一.re元字符

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 import re
 8 
 9 """
10 正则表达式功能:
11     进行字符串的模糊匹配查询。
12 普通字符:
13     大多数字符和字母都会和自身匹配。
14 元字符:
15    字符串的模糊匹配,是通过元字符实现的,如:“ .^$*+?{}[]|()\”
16    1>.“.”:除换行符以外的任意一个符号;
17    2>.“^”:匹配字符串的开始位置;
18    3>.“$”:匹配字符串的结束位置;
19    4>.“*+?{}”:匹配重复的次数,其中“*”重复的是(0,无穷次),“+”重复的是(1,无穷次),“?”重复的是(0,1),“{}”表示指定的次数;
20    5>.“\”:
21    6>.“”:
22    7>.“”:
23    
24 """
25 
26 s1 = re.findall("尹..","尹正杰,尹正文,尹小倩,邓西,yinzhengjie")
27 print(s1)
28 
29 s2 = re.findall("^尹","尹正杰,尹正文,尹小倩,邓西,yinzhengjie")
30 print(s2)
31 
32 s3 = re.findall("jie$","尹正杰,尹正文,尹小倩,邓西,yinzhengjie")
33 print(s3)
34 
35 s4 = re.findall("\d{18}","612401199105197586,110569874136547861")   #匹配连续18位的数字
36 print(s4)
37 
38 s4_1 = re.findall("6124\d*","612401199105197586,110569874136547861,61247474741,6124")
39 print(s4_1)
40 
41 s4_2 = re.findall("6124\d+","612401199105197586,110569874136547861,61247474741,6124")
42 print(s4_2)
43 
44 s4_3 = re.findall("-?\d+","6124,-21,18,-26,12,-6")          #匹配整数和负数
45 print(s4_3)
46 
47 
48 
49 
50 
51 #以上代码执行结果如下:
52 ['尹正杰', '尹正文', '尹小倩']
53 ['']
54 ['jie']
55 ['612401199105197586', '110569874136547861']
56 ['612401199105197586', '61247474741', '6124']
57 ['612401199105197586', '61247474741']
58 ['6124', '-21', '18', '-26', '12', '-6']

二.转义符

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 import re
 8 
 9 
10 """
11 转义符“\”的功能:
12     1>.反斜线后面跟元字符取出特殊功能,比如"\.";
13     2>.反斜杠后面跟普通字符实现特殊更难,比如“\d”;
14         “\d”:匹配任何十进制数;相当于类[0-9];
15         “\b”:匹配任何非数字字符:相当于类[^0-9];
16         “\s”:匹配任何空白字符:相当于[\t\n\r\f\v];
17         “\S”:匹配任何非空白字符:相当于[^ \t\n\r\f\v];
18         “\w”:匹配任何字母数字字符:相当于[a-zA-Z0-9];
19         “\W”:匹配任何非字母数字字符,它相当于[^ a-zA-Z0-9];
20         “\b”:匹配一个特殊字符边界,比如:“空格”,“,”,“&”,“#”等等;
21 """
22 
23 s1 = re.findall("\.com","www.baidu.com")        #表示将元字符“.”转义为普通字符“.”。
24 print(s1)
25 
26 s2 = re.findall("\d+","yinzhengjie2018")
27 print(s2)
28 
29 s3 = re.findall("\w+","yinzhengjie@2018")
30 print(s3)
31 
32 s4 = re.findall(r"y\b","My@ name is y inzhengjie !")      #注意,这个字母“r”表示后面的对象是原生字符串,并不包含任何特殊意义,会直接将这个原生字符串传递给re模块的findall方法。
33 print(s4)
34 
35 s5 =re.findall(r"c\\l","abc\le")
36 print(s5)
37 
38 
39 
40 
41 #以上代码执行结果如下:
42 ['.com']
43 ['2018']
44 ['yinzhengjie', '2018']
45 ['y', 'y']
46 ['c\\l']

三.findall的分组方法

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 
 8 import re
 9 
10 s1 = re.findall("yin+","yinzhengjieyinnnnnnyinnihao")                       #“+”具有贪婪模式的匹配。
11 print(s1)
12 
13 s2 = re.findall("(yin)+","yinzhengjieyinyinnihao")                          #分组概念,将“yin”加入一个分组。
14 print(s2)
15 
16 s3 = re.findall("(尹.{1,3}),","尹正杰,尹正文,尹小倩,邓西,yinzhengjie,")     #分组的举例,我们用分组的效果实现s4的方法。findall方法是会优先匹配分组的内容。
17 print(s3)
18 
19 s4 = re.findall("尹\w+","尹正杰,尹正文,尹小倩,邓西,yinzhengjie,")
20 print(s4)
21 
22 
23 
24 
25 #以上代码执行结果如下:
26 ['yin', 'yinnnnnn', 'yinn']
27 ['yin', 'yin']
28 ['尹正杰', '尹正文', '尹小倩']
29 ['尹正杰', '尹正文', '尹小倩']

四.search方法

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 
 8 import re
 9 
10 """
11 search:
12     只匹配意向符合规则的元素。
13 """
14 
15 
16 s1 = re.search("\d+","yinzhengjie2018@0520")
17 print(s1)
18 print(s1.group())
19 
20 
21 
22 s2 = re.search(r"-blog-aticles-(?P<year>20[01]\d)-(?P<month>\d+)","-blog-aticles-2015-04")      #给分组命名
23 print(s2.group("year"))                                                                                 #表示只取分组的“year”名称。
24 print(s2.group("month"))
25 
26 
27 
28 
29 #以上代码执行结果如下:
30 <_sre.SRE_Match object; span=(11, 15), match='2018'>
31 2018
32 2015
33 04

五.match方法

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 import re
 8 
 9 """
10 match:
11     只匹配字符串的开始的位置。
12 """
13 
14 s1 = re.match("\d+","yinzhengjie2018")
15 print(s1)
16 
17 
18 s2 = re.match("\d+","20180520yinzhengjie")
19 print(s2)
20 print(s2.group())
21 
22 
23 
24 #以上代码执行结果如下:
25 None
26 <_sre.SRE_Match object; span=(0, 8), match='20180520'>
27 20180520

六.字符集

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 import re
 8 
 9 s1 = re.findall(r"a[bc]d","abdacde")
10 print(s1)
11 
12 s2=re.findall(r"a[b.*c]d","abddaslacda*d")                  #我们此处的特殊字字符“.”,“*”并没有实际意义,而是一个普通字符
13 print(s2)
14 
15 """
16 字符集中只有三个特殊符号:  
17         1>.“-”
18         2>.“^” 
19         3>.“\”
20 
21 """
22 s3=re.findall(r"[0-9]+","yinzhengjie2018@0331")             #等效“\d”
23 print(s3)
24 
25 s4=re.findall(r"[a-zA-Z0-9_]+","yinzhengjie2018@0331")    #等效“\w”
26 print(s4)
27 
28 s5=re.findall(r"a[\d]c","ads32421sdf32a3c4sdf")             #等效“\d”
29 print(s5)
30 
31 ret=re.findall(r"a[^\da-z]c","ads32421sdf32a3c4sa@cdf")    #等效“\d”
32 print(ret)
33 
34 
35 
36 
37 
38 #以上代码执行结果如下:
39 ['abd', 'acd']
40 ['abd', 'acd', 'a*d']
41 ['2018', '0331']
42 ['yinzhengjie2018', '0331']
43 ['a3c']
44 ['a@c']

七.管道符

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 import re
 8 
 9 s1 = re.findall("www\.(?:\w+)\.(?:com|cn)","www.yinzhengjie.com;www.yinzhengjie.cn,www.yinzhengjie.org.cn;")        #注意这个时候“?:”是取消优先级的作用!
10 print(s1)
11 
12 
13 
14 
15 #以上代码执行结果如下:
16 ['www.yinzhengjie.com', 'www.yinzhengjie.cn']

八.贪婪匹配

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 import re
 8 
 9 
10 # 贪婪 模式
11 s1 = re.findall("abc+","dasasdabccccasd")
12 print(s1)
13 
14 s2 = re.findall("abc{2,5}","dasasdabcccccccasd")
15 print(s2)
16 
17 # 非贪婪模式:按着最小重复数
18 s3 = re.findall("abc+?","dasasdabccccasd")
19 print(s3)
20 
21 s4 = re.findall("abc{2,5}?","dasasdabcccccccasd")
22 print(s4)
23 
24 s = "<div>yin<img></div><a href=""></div>"
25 s5 = re.findall("<div>.*?</div>",s)
26 print(s5)
27 
28 s6 = re.search("<div>.*?</div>",s)
29 print(s6)
30 
31 """
32 一.几个常用的非贪婪匹配:
33     1>."*?":重复任意次,但尽可能少重复;
34     2>.“+?”:重复1次或更多次,但尽可能少重复;
35     3>.“??”:重复0次或1次,但尽可能少重复;
36     4>.“{n,m}?”:重复n到m次,但尽可能少重复;
37     5>."{n}?":重复n次以上,但尽可能少重复;
38 
39 二.".",“*”,“?”的用法
40     1>.“.”是任意字符;
41     2>.“*”是取“0”至无限长度;
42     3>."?"是非贪婪匹配;
43     “.*?x”表示取前面任意长度的字符,直到x出现。
44 
45 """
46 
47 
48 
49 
50 #以上代码执行结果如下:
51 ['abcccc']
52 ['abccccc']
53 ['abc']
54 ['abcc']
55 ['<div>yin<img></div>']
56 <_sre.SRE_Match object; span=(0, 19), match='<div>yin<img></div>'>

九.split方法

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 import re
 8 
 9 s = "yinzhengjie2018hello05ACE19world"
10 
11 s1 = re.split("\d+",s,2)        #后面的数字表示指定分割的次数,如果不加数字默认全部分割。
12 print(s1)
13 
14 
15 s2 = re.split("(\d+)",s)
16 print(s2)
17 
18 
19 
20 
21 #以上代码执行结果如下:
22 ['yinzhengjie', 'hello', 'ACE19world']
23 ['yinzhengjie', '2018', 'hello', '05', 'ACE', '19', 'world']

十.sub方法

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 import re
 8 
 9 s = "yinzhengjie2018hello05ACE19world"
10 
11 
12 s1 = re.sub("yinzhengjie","尹正杰",s)
13 print(s1)
14 
15 s2 = re.sub("e","E",s,2)
16 print(s2)
17 
18 
19 
20 
21 #以上代码执行结果如下:
22 尹正杰2018hello05ACE19world
23 yinzhEngjiE2018hello05ACE19world

十一.complie方法

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 import re
 8 
 9 s = "yinzhengjie2018hello05ACE19world"
10 
11 obj = re.compile("\d+")         #编译规则。
12 
13 s1 = obj.findall(s)
14 print(s1)
15 
16 
17 
18 
19 #以上代码执行结果如下:
20 ['2018', '05', '19']

十二.finditer方法

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 import re
 8 
 9 """
10 finditer:
11     返回的是一个迭代器对象。
12 """
13 
14 s = "yinzhengjie2018hello05ACE19world"
15 
16 s1 = re.finditer("\d+",s)
17 print(s1)
18 
19 for i in next(s1).group():
20     print(i)
21 
22 
23 
24 
25 #以上代码执行结果如下:
26 <callable_iterator object at 0x032005F0>
27 2
28 0
29 1
30 8

十三.爬虫练习

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6 
 7 import requests
 8 import re
 9 
10 
11 def getPage():
12     respnse_str = requests.get("https://movie.douban.com/top250?start=0&filter=")
13     # print(type(respnse_str.text))
14 
15     return respnse_str.text
16 
17 
18 def run():
19     resonse = getPage()
20 
21     obj = re.compile('<div class="item">.*?<em.*?>(?P<id>\d+)</em>.*?<span class="title">(.*?)</span>'
22                      '.*?<span class="rating_num".*?>(.*?)</span>', re.S)
23 
24     ret = obj.finditer(resonse)
25 
26     # res =  next(ret).group()
27     # print(res)
28     print(ret)
29 
30 run()
31 
32 
33 
34 
35 #以上代码执行结果如下:
36 <callable_iterator object at 0x02F47AF0>

  正在表达式主要是用于模糊匹配,Python中的正则用法比较简单,但是规则比较麻烦,你可以根据你的需求配置不同的规则,更多详情请参考:http://www.cnblogs.com/yinzhengjie/p/6428006.html

 

转载于:https://www.cnblogs.com/yinzhengjie/p/8542361.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值