正则表达式
正则表达式
1.是针对字符串的
2.做模糊的匹配
两种匹配方式
1.普通的字符串匹配
>>>re.findall('huang','grtgjkeqwhuangjianto')
2.元字符(模糊匹配)
. 代表取代一位字符 ^表示开头 $表示结尾
* 表示重复上一个字符的(0,+无穷) 这个是贪婪匹配
a = 'abbcbbbdbbbb' re.findall(bb*,a) 首先会重复0次(及不存在这个字符),再1次,直到重复字符串这长,及有b,bb,bbb,bbbb,bbbbb等等模糊匹配,寻找a中能匹配上的, 即bb,bbb,bbbb 组成列表表达出来。注意,
开始时一个b的时候,虽然可以分出来匹配,但是 贪 婪 匹 不会配会拆分b出来匹配,自会最大限度匹配多的b
+ 表示重复上一个字符的(1,+无穷) 比上面多了起始最少存在这个字符(1次)
? 表示重复上一个字符的(0,1)次 ,及字符存在不存在 先匹配最大的一次,再匹配0次
{ } 自定义重复次数 {0,} ==* {1,}==+ {0,1} ==? {6}:重复上一字符六次 {1,6}:重复上一字符1到6次
print(re.findall('b{1,5}$',b)) 重复结尾b字符1到5次
[ ] 字符集,表示取其中一个 print(re.findall('q[a-z]*','quo')) 注意 [ ]在里面除了一些特殊字符(\,-,^),其余都按正常字符串处 理 这里把【a-z】看成一个整体 *重复上一个字符,就是任意取a-z一个元素 , 相当于匹配q[a-z][a-z].....
*是完全照搬上一个元素,不可把不确定取值固 定再 重复。 ^在[ ] 中表示出去什么之外 [^a-z],除小写字母外,都可以去取任 意一个字符
\ 转义符 把有意义的字符变成不同字符 把不同字符变成有意义的
\d 匹配数字(一位) \d+ 匹配任意数字 \D 相反 不是数字 \s 取空白 \S 相反 \w 字母数字字符 相当于【aA-zZ】,[0-9] \b 匹配特殊字符包括空格
关于转义符,我们要注意,在re模块中\是有意义的,想直接取其字符,需要再加\来转义
print(re.findall('ab\\c','degehgab\cde')) #注意,我们转义都是再re模块中进行,re是一个相对独立的代码,我们想在re模块中表现
#\c就要输入 \\c 但是系统会先把这个交给python解释器,python解释器先解释一遍,想
#要传入两个\必须输入四个\\\\表示转义了两个\,变成普通字符传入re模块中,也可前面
#加入r表示python对匹配字符原声传入,不做任何解释
#其实这就是在原字符串中要匹配带\的字符,匹配条件中\的转义的转换,python一次,re模块一次,才能把普通字符\传入匹配条件
print(re.findall('ab\\\\\*','rfhrab\*')) 先考虑转义*,在考虑把\转义成字符串
() 分组
print(re.search("(?P<name>[a-z]+)(?P<number>\d+)",'123abc456def').group('name'))
#?P固定格式,<>里面是赋一个变量名,把后面按照匹配条件
# 匹配到的数据存起来,看起来花里胡哨的,其实就是多加一个变量把搜索数据存在该变量下,
#search 找到一个符合的数据就停止匹配 search 得到的都是一个对象.需要用group取出
print(re.findall('jianjian|xiaojian','fdjianjiangtjian')) #|是或者的意思,跟linux中一样
print(re.match('123','123dasd123').group()) #跟search一样,就是强制匹配头部字符,就相当于加了一个^号,输出对象
print(re.split(' ','huangjian is good')) #以什么分开
print(re.split('[a|b]',"huangjian is niubi")) #如果有分组符号,符号里面是先以a分段,再把结果给n分段
print(re.split('(a|b)',"huangjian is niubi")) #注意如果是分组的字符来作为分割条件,则保留分割符
print(re.sub('h','H','huangjian')) #替换
print(re.sub('[a|b]','1','huangjianniubi'))
print(re.subn('[a|b]','1','huangjianniubi')) #替换,多了一个替换次数
haha = re.finditer('[\d|a-z]','shuzi123456HAHA') #跟findall目的一样,但是却是一个生成器,可以用next方法取或者for循环取
for i in haha: #到对象,再用group取其值
print(i.group())
pipei = re.compile('huangjian') #直接先把匹配条件赋值
pipei.findall('mingzishihuangjian') #直接用条件寻找,这样可以避免重复多次写一样的条件
print(re.findall('www\.(baidu|taobao).com','wangzhan is www.baidu.com sousuo')) #注意,这个跟分段split有点像,如果字符是分组字符,则会
#出现一些特殊的情况,split是保留分组符,而findall是找到符合字符串,只保留分组字符
print(re.findall('www\.(?:baidu|taobao).com','wangzhan is www.baidu.com sousuo')) #强行不让系统只显示分组字符
其实分组的目的就是为了只关注那一块, 或者把什么字符看成一个整体来匹配,主要是前者,关注什么给什么分组在附加变量就能很好的找到关注的内容
#findall 得到结果是列表 search得到结果是对象 finditer得到结果是生成器 math和search一样,只是前面加了^

浙公网安备 33010602011771号