Python基础前期后后看了五六遍,除了能读懂一些简单的代码,一直也没有进阶。
这次借助一个爬虫教学视频。把学习中的一些重点写下来,一个是自己巩固,一个是也帮助跟自己一样有疑惑的朋友有个更深的理解。
这篇主要讲的是正则
正则字符:
1)^ $ * ? + {3} {3,} {3,6}
2) [] [^] [a-z] .
3) \s \S \w \W
4) [\u4E00-\u9FA5] () \d
这里都以python例子来验证说明
^表示以某个字符开头,比如 ^a,即表示以a开头
.表示任意字符(除\n换行符以为),比如 ^a. 表示以a开头,后面可以带上任意字符
* 表示匹配前一个字符0次或无限次,比如 ^a.* 表示以a开头,后面带一个或者多个任意字符
上面这个例子,字符串是以a开头,后面接任意字符,所以是匹配 ^a.* 这个规则的,所以程序打印出yes。很好理解
$ 以某个字符结尾,比如 5$, 则表示匹配以5结尾的字符串
看上图一目了然,不再做多介绍
有个注意点
如果我们的正则是这样写的 ^a.5$ 则表示的只是共3个字符,以a开头,第二个任意字符,第三个为5即结尾。所以如果没有*的话,上图例子中的匹配都是不成功的。
正则表达式的贪婪模式
比如一个字符串"abaaaaaaabbbbbgseraggts",我想用正则匹配提取baaaaaaab,按我们上面所学,则表达式应该是这么写 .*(b.*.b).*
解释一下表达式
以字符开头+(b+任意字符+b)+任意字符,把我们想截取的,加上括号,python中用group获取。
运行程序我们发现,打印出来的是bb,而并非我们要的baaaaaaab。
这就是因为贪婪模式,可以这么理解,.*这里,正则会尽量多的去匹配字符串"abaaaaaaabbbbbgseraggts",所以他是是找到倒数第二个b才去匹配(b.*b),结果匹配出来的是bb,可以用从右往左反向匹配匹配来理解。
基于上面的贪婪模式,我们可以在正则表达式中改成这样
.*?(b.*.b).* ,即变成非贪婪模式,从左边开始匹配,找到第一个b开始。如果图运行结果
如果直接.*?(b.*.b).*,则出来的结果是baaaaaaabbbbb,因为贪婪模式的原因,他会去匹配尽量多的b
所以正确的表达式是 .*?(b.*.?b).*
+ 与 * 大同小异,不同的一点是,+限定前面一个字符出现的次数至少要一次,而*则没有这个限定,可以是0次,也可以是1次或者多次。
比如正则为b.+b , bab或者baacb都是匹配这个正则的,而bb则不匹配这个正则
但是bb,bab,baacb都是匹配 b.*b 这个正则的。
如下图实例
{3} {3,} {3,6} 这三个就是限定字符出现的次数
{3}表示出现三次
{3,}表示3次或3次以上
{3,6}表示3-6次包括3和6次。
| 可以理解为或
比如 abc |abc123 这个正则,则只要匹配这两个字符串中的一个,则表示匹配成功
[] ,比如[1243],表示中括号中只要有一个匹配则表示匹配
还有一种表示法[0-9]表示0-9之间的任意数字有一个匹配的话就是可以,还有[a-Za-z]都是一样的道理。而[^]在表示取反,例如[^5]则表示除了5以外的所有字符
中括号做常用的是表示电话号码
1[48357][0-9]{9} 1开头,第二位为48357其中一个,后面只能是9为0-9的任意数字
\s 表示空格
\S 表示非空格
\w 可以用与中括号的[A-Za-z0-9_]这之间的任意字符一个意思
\W 是\w的取反
[\u4E00-\u9FA5] 表示汉字
这里有个注意点,因为我用的是python2.7,所以中文要主要编码问题
\d 代表的是数字,这个很简单,不再多讲
正则是一个很重要的知识点,最主要是要懂得搭配使用。
有了正则,在爬虫中就可以精准的爬到我们想要的东西。