<style></style>
Python学习day19-常用模块之re模块正则表达式re的基本语法(匹配规则):
Python学习day19-常用模块之re模块
正则表达式
正则表达式我们应该或多或少都听过,因为这并不是python所独有的东西,而是一个比较广泛的概念。简单来说正则表达式就是从字符串里寻找特定的字符串,通过各种通配符和表达式。在Python中,正则表达式通过内嵌集成成为一个re模块,就是用来实现正则表达式的各种功能。
正则表达式的大致匹配过程是:依次拿出表达式中的字符来和文本中的字符进行比较,如果每一个字符都能匹配,则匹配成功,一旦有匹配不成功的字符则匹配失败。且一旦匹配成功就会跳过这个字符,并不会重复取值。
re的基本语法(匹配规则):
re的语法很多,我们这里只介绍比较常用的一部分语法的用法:
xxxxxxxxxx136 1
import re2
3
s = '王大炮打炮被大炮打死了王大炮打炮被大炮打死了'4
# 正常情况下,如果我们想要取出'大炮'这个字符只能用一下这种方法5
print(s[1:3], s[6:8])6
7
# 可见这非常的复杂,而且非常low8
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/n80
s = 'avc sdf fe'81
print(re.findall('\s',s))82
# ['','']83
84
# \S:非 空格/t/n85
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():从开头搜索,搜索到了就是有,没搜索到就是None126
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())