看了网上很多大佬的博客,感觉受益匪浅,所以我也来发表一下自己的理解,废话不多说,直接上代码。
这里我们引用re模块,然后定义一个字符串
import re
str='jjjjjkkkkkjkjjjkjjkjj'
1,一个.
这一个.的作用就是,匹配从j开始为第一个字符,k结束为第三个字符,中间的点为第二个字符组成的字符串,在上面的str里面从左往右依次找,从第一个j开始然后往后找,找到jjk就能匹配了,相当于就是j和k是必须在第一个和第三个,中间夹个什么无所谓,但是必须要夹一个,那个.相当于就是代替中间夹的那个。
real=re.findall('j.k',str)
#j和k中间的.,就是匹配除了\n(换行符)之外的任意一个字符
看看运行结果,运行返回的是一个列表。
2,一个*,匹配*前面出现大于等于0次的字符
这个*前面的字符也就是j,要匹配的就是有没有j的都行,但是结尾必须是k,因为是在*之前出现的字符,大于等于0,也可以是零个,所以从头开始找就有,jjjjjk,j出现了五次,符合条件,k(第二个k),j出现了0次,k(第三个k),j出现了0次,以此类推
real=re.findall('j*k',str)
#这个*的意思就是匹配,在*之前的字符出现大于等于0次的
看看运行结果,分别是j出现了5次,0次,0次,0次,0次,1次,3次,2次
3,.*贪婪,在.*前面的字符开始,后面的字符结束,能包含的最长的一串字符串
这个.*就是匹配从j开始,k结束,你能看到的最长的一串,所以这里匹配到的就是jjjjjkkkkkjkjjjkjjk
real=re.findall('j.*k',str)
#.*贪婪,贪婪就是越多越好,所以就是匹配.*前面的字符为开始,后面的字符为结束的所有内容
看看结果,果然就是从第一个j开始,到最后一个k结束,最后两个j没有算进去就是因为是以k结束
4,.*?非贪婪,以.*?前面的字符为开始,后面的字符为结束,进行包含,中间没有字符也可以
这个.*?也叫非贪婪,就是没有上一个这么贪,上一个想把看到的都包含进去,这个就是有j和k的就行,不管中间有没有字符,也是从第一个j开始,从左往右开始匹配,走过的就不走了,第一个匹配到的就是jjjjjk,有j,有k,中间有四个j,第二个匹配到的是jk,第三个是jjjk,这个中间夹了两个,但是也符合规定,因为是以j开始,k结束的,第四个是jjk
real=re.findall('j.*?k',str)
#.*?就是非贪婪,.*?前面的字符为开始,后面的字符为结束开始匹配,中间没有字符也可以匹配
看看结果,果然如我所料
5,(.*?)非贪婪pro,以(.*?)前面的字符为开始,后面的字符为结束,取包含在中间的字符
最后一个(.*?)非贪婪升级版,这个是只取j和k中间的,这个更不贪,第一个匹配的j和k中间的就四个j,炸弹,所以就取jjjj,第二个j和k中间的就是空,就没有,那就取' ',第三个j和k中间的是两个j,就取jj,第四个j和k中间的是一个j,就取j
real=re.findall('j(.*?)k',str)
#(.*?),我称它为非贪婪加强版,只保留(.*?)前面的字符和后面的字符中间夹的内容
看看结果
谢谢大家阅读,如果有什么问题欢迎大家指正。