1 # 第二十三节课:正则表达式re模块:
2 '''
3 本节课大纲:
4 1- 概述
5 2- 实用语法
6 3- re模块
7 '''
8 # 1- 正则表达式概述:
9 # 常规的字符串方法可以处理字符串“
10 # 'huifasnkjfh'.find(); ''.replace()
11 # 每一次匹配都需要实用一个单独的方法去完成,如果匹配的东西比较多,得写很多方法 那么,能不能把这些方法都指定出一个规则呢?
12 '''
13 这个规则可以对一些动态的不规则的字符串做做以下操作
14 主要是针对字符串进行操作,可以简化对字符串的复杂操作
15 》匹配:检查字符串是否符合正则表达式中的规则
16 》切割:按一定的规则将字符串分割为多个子字符串
17 》替换:将字符串中符合规则的字符替换成指定字符
18 》获取:获取与规则相符的字字符串
19 '''
20
21 # 2- 实用语法:这个语法是通用的,Java中也可以用,但是非常庞大,有各种组合,我们只需要掌握常用的,其他可以查实用手册
22 # 1. .通配符:可以匹配任何除换行符’\n‘以外的字符。实际使用如下:
23 # 待匹配文本:'Songqin'
24 # 正则表达式:'S.....n'
25 # 匹配结果:'Songqin'
26 import re
27 # . 是通配符,一个.只代表一个元素
28 # res = re.findall('s..','Songqinsohuifjsonjfis\n') #findall()函数需要两个必填参数(正则表达式,处理的字符串) 2、返回类型:列表
29 # print(res) #打印得:['soh', 'son']首字母大写的Son没有被识别到,说明正则表达式严格区分大小写.s\n也没有打印出来,说明换行符也无法获取
30
31 # 2.(pattern)* 出现0次或者多次 允许模式重复0或者多次。实际使用如下:即*前面的元素可以没有出现过或者多次出现
32 # 待匹配文本:'www.songqinnet.com'
33 # 正则表达式:'w*\.songqin\.com'
34 # 匹配结果:'www.songqinnet.com'
35 # res = re.findall('s*','Songqinsohuifjsonjfis') #findall()函数需要两个必填参数(正则表达式,处理的字符串) 2、返回类型:列表
36 # print(res) #打印得:['', '', '', '', '', '', '', 's', '', '', '', '', '', '', 's', '', '', '', '', '', 's', '']
37 # res = re.findall('1*','Songqinsohuifjsonjfis') #findall()函数需要两个必填参数(正则表达式,处理的字符串) 2、返回类型:列表
38 # print(res) #打印得:['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
39 # res = re.findall('son*','Songqinsohuifjsonjfis') #findall()函数需要两个必填参数(正则表达式,处理的字符串) 2、返回类型:列表
40 # print(res) #打印得:['so', 'son']
41
42 # 3. + 出现1次或者多次
43 # res = re.findall('s+','Songqinsohuifjsonjfis') #findall()函数需要两个必填参数(正则表达式,处理的字符串) 2、返回类型:列表
44 # print(res) #打印得:['s', 's', 's']
45 # 注意:大多数情况下*和+作用都是一样的,只是符合前面的元素允许出现的次数的区别,通常:
46 # res = re.findall('s*','Songqinsohuifjsonjfis') == res = re.findall('s+','Songqinsohuifjsonjfis') 打印得:['sohuifjsonjfis']
47
48 # 4. ? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式:
49 # 待匹配文本:'Songqin'
50 # 正则表达式:'So(.+?)'
51 # 匹配结果:'n'
52 # res = re.findall('s.?','Songqinsohuifjsonjfis') #findall()函数需要两个必填参数(正则表达式,处理的字符串) 2、返回类型:列表
53 # print(res) #打印得:['so', 'so', 's']
54 # res = re.findall('soo.?','Songqinsohuifjsonjfis') #findall()函数需要两个必填参数(正则表达式,处理的字符串) 2、返回类型:列表
55 # print(res) #打印得:[] 如果前面的元素片段没有,就是返回的空列表
56
57 # 5. ()匹配括号内的表达式,也表示一个组
58 # 待匹配文本:'SongqinSongqin'
59 # 正则表达式:'(Songqin){2}'
60 # 匹配结果:'SongqinSongqin'
61 # res = re.findall('(Songqin){1}','SongqinSongqin') #findall()函数需要两个必填参数(正则表达式,处理的字符串) 2、返回类型:列表
62 # print(res) #打印得:['Songqin', 'Songqin']
63
64 # 6. 其他常用:
65 # 模式 描述
66 # \w 匹配字母、数字及下划线
67 # \W 匹配非字母数字及下划线
68 # \S 匹配任意非空字符
69 # \d 匹配任意数字,等价于[0-9]
70 # \D 匹配任意非数字
71 # ^ 匹配字符串的开头
72 # $ 匹配字符串的末尾
73 # res =re.findall('1\D','Songq123insohuifjsonjfis') #findall()函数需要两个必填参数(正则表达式,处理的字符串) 2、返回类型:列表
74 # print(res) #打印得:['12'] 返回的值都是该字符串和其后面的那个
75 # res =re.findall('\D','Songq123in sohuifjsonjfis') #findall()函数需要两个必填参数(正则表达式,处理的字符串) 2、返回类型:列表
76 # print(res) #打印得:['S', 'o', 'n', 'g', 'q', 'i', 'n', ' ', 's', 'o', 'h', 'u', 'i', 'f', 'j', 's', 'o', 'n', 'j', 'f', 'i', 's']
77 # res =re.findall('^\D{3}','Songq123in sohuifjsonjfis') #findall()函数需要两个必填参数(正则表达式,处理的字符串) 2、返回类型:列表
78 # print(res) #打印得:['Son', 'in ', 'soh', 'uif', 'jso', 'njf'] 表示符合要求的连续三位数的集合.{}里面装的是位数/ 加上^打印得:['Son']
79 # 推荐工具:菜鸟工具
80
81 # 3- re模块
82 '''
83 正则表达式(Regular expressions 也称为:REs,或 regexes或regex patterns) 本质上是一个微小的且高度专业化的编程语言
84 正则表达式并不是Python的一部分,它被嵌入到Python中,并通过re模块提供使用
85 使用正则表达式,需要制定一些规则来描述那些你希望匹配的字符串集合
86 re模块要点:
87 常用方法
88 长用修饰符
89 ***常用用法有6个:
90 1、 re.match(pattern,string,flags=0)
91 从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
92 2、 re.search(pattern,string,flags=0)
93 扫描整个字符串并返回第一个成功的匹配
94 3、 re.sub(pattern,repl,string,count=0)
95 用于替换字符串中的匹配项,repl:替换的字符串,也可为一个函数
96 4、 re.compile(pattern[,flags])
97 用于编译正则表达式,生成一个正则表达式(pattern)对象,供 match()和 search() 这两个函数使用
98 5、 findall(string[,pos[,endpos]])
99 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
100 6、 re.split(pattern,string[,maxsplit=0, flags=0])
101 能够匹配的子字符串将字符串分割后返回列表
102 '''
103 # 1、 compile()生成一个正则表达式的对象:使用场景 这个正则表达式用得地方很多
104 # res= re.findall('\d{11}',' 12345songqin18712312312#abcd13912212212')
105 # print(res) #打印得:['18712312312', '13912212212'] 下面用compile生成一个正则表达式对象
106 # reObject = re.compile('\d{11}')
107 # h=reObject.findall(' 12345songqin18712312312#abcd13912212212')
108 # print(h) #打印得:['18712312312', '13912212212']
109 # hh=re.compile('\w{2}')
110 # hhh=hh.findall('hufsdnjkv;4e78nufj')
111 # print(hhh) #打印得:['hu', 'fs', 'dn', 'jk', '4e', '78', 'nu', 'fj']
112 #
113 # 修饰符 描述
114 # re.I 使匹配对大小写不敏感
115 # re.l 做本地化识别(lcale-aware)
116 # re.M 多行匹配,影响^和$
117 # re.S 使.匹配包括换行在内的所有字符
118 # re.U 根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B
119 # re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解
120 # 取值可以使用按为或者运算符'|'表示同时生效,比如re.I|RE.M
121 # ------re.I
122 # res = re.findall('s.','Shgjshjwesoi')
123 # print(res) #打印得:['sh', 'so'] 第一个大写的S没有被匹配到,这是用修饰符: re.I
124 # res = re.findall('s.','Shgjshjwesoi',flags=re.I)
125 # print(res) #打印得:['Sh', 'sh', 'so']
126 s='Shgjs\nhjwesoi'
127 res = re.findall('s.',s,flags=re.I|re.S)
128 print(res) #打印得:['Sh', 's\n', 'so'],不仅匹配到了大小写,还匹配到了换行符