Python学习day19-常用模块之re模块

 

<style></style>

 

Python学习day19-常用模块之re模块正则表达式re的基本语法(匹配规则):

Python学习day19-常用模块之re模块

 

正则表达式

正则表达式我们应该或多或少都听过,因为这并不是python所独有的东西,而是一个比较广泛的概念。简单来说正则表达式就是从字符串里寻找特定的字符串,通过各种通配符和表达式。在Python中,正则表达式通过内嵌集成成为一个re模块,就是用来实现正则表达式的各种功能。

正则表达式的大致匹配过程是:依次拿出表达式中的字符来和文本中的字符进行比较,如果每一个字符都能匹配,则匹配成功,一旦有匹配不成功的字符则匹配失败。且一旦匹配成功就会跳过这个字符,并不会重复取值。

re的基本语法(匹配规则):

re的语法很多,我们这里只介绍比较常用的一部分语法的用法:

     
xxxxxxxxxx
136         1
import re
2
3
s = '王大炮打炮被大炮打死了王大炮打炮被大炮打死了'
4
# 正常情况下,如果我们想要取出'大炮'这个字符只能用一下这种方法
5
print(s[1:3], s[6:8])
6
7
# 可见这非常的复杂,而且非常low
8
9
# 所以调用re模块来做的话,就像以下这样
10
11
res = re.findall('大炮',s)
12
print(res)# 这样我们就可以直接找到字符串里的所有‘大炮’的字符
13
14
# 另外还有一些别的用法
15
16
# ^:判定开头,注意要放在字符串前面,不会往后寻找,只会判定开头
17
print(re.findall('^王大炮', s))
18
# 即返回结果'王大炮',因为字符串开头就是王大炮
19
20
# $:结尾,要注意放在字符串后面,和^相反
21
print(re.findall('死了$', s))
22
#返回结果是'死了'
23
24
# []:匹配中间的字符
25
s = 'abcdef'
26
print(re.findall('[ace]', s))  # 只要单个字符
27
# ['a', 'c', 'e']
28
# 返回的是分开的单个字符,且只要单个字符
29
30
# []+^:取反,^对[]内的元素,除了这些字符,输出其余的
31
print(re.findall('[^acef]', s))
32
# ['b','d']
33
34
# .:任意单个字符(除了换行符\n,如果需要取换行符,需要在字符串前面加r)
35
s = 'ababadaeaf'
36
print(re.findall('a.', s))
37
print(re.findall('a..', s))
38
# ['ab', 'ab', 'ad', 'ae', 'af']
39
# ['aba', 'ada']这个结果说明字符串里取过的字符不会重复取,只会取第一次
40
41
# *:可以替代字符0-无穷,都取出来,中间是空字符
42
s = 'abaacaaaaa'
43
print(re.findall('a*',s))
44
# ['a', '', 'aa', '', 'aaaaa', '']即但凡有a的地方都输出,没有的话就返回空数据
45
46
# +:前面的字符1-无穷,都取出来
47
print(re.findall('a+',s))
48
# ['a', 'aa', 'aaaaa']这种情况不存在空的情况,即最少为1个字符才会进行输出
49
50
# ?:前面的字符0-1个,即输出的都是单个字符,如果不是给定值,就返回空值
51
print(re.findall('a?',s))
52
# ['a', '', 'a', 'a', '', 'a', 'a', 'a', 'a', 'a', '']
53
54
# {m}:前面的字符m个,括号里的数字即为保留的位数,所以输出是5个a,如果字符串里没有五个a,就会输出空
55
print(re.findall('a{5}',s))
56
# ['aaaaa']
57
58
# {n,m}:前面的字符2-3个
59
print(re.findall('a{2,3}', s))# 会往最大的m取,最小n为才会输出
60
# ['aa', 'aaa', 'aa']#会取最大的m,也就是说如果字符串里有长度超过m的字符,只会返回长度为m的,也就是三位的,然后重新计数。
61
62
# \d:数字
63
s = 's1+s*2-s+3/'
64
print(re.findall('\d',s))# 只会输出字符串内的数字类型
65
# ['1','2','3']
66
67
# \D:非数字
68
print(re.findall('\D',s))# 不会输出数字类型,其余均取出
69
# ['s', '+', 's', '*', '-', 's', '+', '/']
70
71
# \w:数字/字符/下划线 都会取出来
72
print(re.findall('\w',s))
73
# ['s','1','s','2','s','3']
74
75
# \W:非数字/字符/下划线 取出来
76
print(re.findall('\W',s))
77
# ['+','*','-','+','/']
78
79
# \s:空格/t/n
80
s = 'avc sdf fe'
81
print(re.findall('\s',s))
82
# ['','']
83
84
# \S:非 空格/t/n
85
print(re.findall('\S',s))
86
# ['a','v',c','s','d','f','f','e']
87
88
# \:把后面的字符取消特殊意义
89
s = 'aba\d'
90
print(re.findall(r'\\d', s))
91
# ['\\d']
92
93
# .*:有什么都要,贪婪,结果最大化
94
s = 'abcabc'
95
print(re.findall('a.*c', s))
96
# ['abcabc']
97
98
# .*?:非贪婪,最小化,找到符合条件就停止,*********这个应该是以后用的最多的正则表达式
99
print(re.findall('a.*?c', s))
100
# ['abc','abc']
101
102
# ():匹配到结果后只要括号内的,不要外面的,但匹配的时候条件是要全引号里的
103
s = 'abacad'
104
print(re.findall('a(.)', s))#点表示a后面的一个字符,加括号表示只显示这一个字符
105
# ['b','c','d']
106
107
# A|B:A和B都要
108
print(re.findall('a|b', s))# a和b都要,单字符值
109
# ['a','b','a','a']
110
111
# re模块的方法
112
113
# re.complie,根据包含的正则表达式的字符串创建模式对象。
114
s = 'abc123def\n456'
115
print(re.findall('\d+', s))
116
com = re.compile('f.')
117
print(re.findall(com, s))
118
# ['123','456']
119
# []
120
121
# re.S:匹配里面的所有字符,包括换行
122
print(re.findall('f.', s, re.S))
123
# ['f\n']
124
125
# re.match():从开头搜索,搜索到了就是有,没搜索到就是None
126
s = 'abc'
127
res = re.match('\d+',s)
128
print(res)
129
res.group()
130
131
# re.search():搜索第一个搜索结果,找到即停止
132
re0s = re.search('\d+',s)
133
print(res)
134
print(res.group())
135
136
# re.split():以匹配规则来切割
137
s = 'abc534adf235sdf4'
138
print(re.split('\d+', s))
139
140
# re.sub():按照匹配规则来替换**************************重要
141
print(re.sub('\d+','***',s))
142
143
# re.subn():按照匹配规则替换,并计数
144
print(re.subn('\d+','***',s))
145
146
# 分组:一个括号叫一个分组,并给每个分组起名,key:value?,django里URL分组
147
s = 'abc123edf456'
148
res = re.search('abc(?P<abc>\d+)edf(?P<edf>\d+)', s)
149
print(res.groupdict())
   

 

上一篇:ccs-基础-阴影


下一篇:css定位