python-day5爬虫基础之正则表达式2
dot:
'.'匹配任意的字符
'*'匹配任意多个(0到多个) 如图所示,
程序运行结果是abc,之所以没有匹配\n,是因为\n是换行符,它就代表这个字符串是两行的,而正则表达式是一行一行去匹配的。在re.match中遇到换行符就默认的认为字符串结束了,所以就不会去匹配下一行的内容,因此输出abc。
DOTALL:单单表示字符串,还可以表示换行符。这样的话,他就可以匹配整个字符串了。如上所示。
caret:中文意思就是拖字号,shift+6,
findall,就是找出所有的‘abc’,但是在匹配的时候,我们把它当成一个整体来匹配了,虽然它是两行,其中‘^’表示开始位置,此时如果我们加一个re.MULTILINE,此时这个‘^’就不单单表示字符串的开始了,而是表示行的开始,所以遇到换行符后又是一个新行。程序如下:
‘^’表示字符串的开始,‘$’表示字符串的结束,先看程序:
之所以匹配了abc2,没有匹配abc1,是因为在不加任何flag的情况下,‘$’表示的是一个字符串的结束,而不是行的结束,虽然里边有个换行符,但是没有任何的flag。如我我们加上re.MULTILINE,它就代表我们将这个字符串,当成多行来处理,那样的话,运行结果就不得而知了。如下:(\d表示的是数字)
从上可以看出,没有re.MULTILINE就代表字符串的结束,有re.MULTILINE就代表行的结束。
*:前一个匹配单元的匹配次数,匹配0到多个
+:前一个匹配单元的匹配次数,匹配1到多个
?:前一个匹配单元的匹配次数,匹配0到1个
那么 r’ab*’表示的就是匹配1个a,b可以是0个,也可以是多个,看程序:
这里补充一下,如果我们在后边再加上group,就可以将匹配结果打印出来了,如下:
如果我们将*换成+,那就匹配不上了, 那样就代表1个a,b最少是一个,看程序:
同理,把+换成?,也是可以匹配的。
接下来,在看一看贪婪和非贪婪(greedy/non-greedy)
先看程序:
.表示任意字符,*表示0到多个,而这样系统默认是贪婪模式,所以,H 1 > t I t l e < / H 1 全部都当成了任意字符,因为最后边有个>。其实匹配结果是这样的<H1>title</H1>,不知这样写能不能看懂,朋友们。
还有就是如果最后边没有那个‘>’,那么他就认为最后一个’>’是<H1>中的红体部分,运行结果我们也就知道了,如下:
如果此时,我们加一个?,他就变成非贪婪模式,看程序:
默认的是贪婪模式,要想非贪婪,就要加?
再给大家介绍一个,{m}表示匹配个数,看程序吧
通过上边这个程序,大家应该都看明白了吧,{m}代表的就是匹配的个数,如果个数不够m个,就会报错,如果个数大于m个,就会输出m个结果,多余的也不会输出。再扩展一下,看程序:
两个输出语句的区别就是一个有问号,一个没有问号,大家应该都明白,带问号的就是非贪婪模式,而{2,4}代表匹配2到4个,贪婪模式下,会匹配多的,也就是4个,非贪婪模式下,会匹配少的,也就是2个。
再看看转义字符’\’,看程序:
如果不加转义字符‘\’,$就会被系统认为是结束字符,加上之后,就会被当成一个符号来匹配。
最后,再写个[ ],它就代表集合的意思,就是可以匹配集合里边的任意一个,先看程序:
以上就是今天所学,总结的可能有些不是很细,部分内容可能理解有些不对,还请多多指出,大家共同学习,一起进步,谢谢。