果果有个小小的计划,就是准备把所有文章做成PDF供大家传阅。想法挺好的,但是做起来不大容易。因为太懒,平时没有备份文章的习惯,在公众平台后台写完就直接发了,要想找所有文章只能去微信那儿找。大体看了下,从一开到现在一共160多篇文章,如果一篇一篇打开然后复制粘贴的话,我一个周末就不用干别的了。没办法,只能写个爬虫自动收集。(然而写完周末也没了,但是程序员无疑更喜欢后者)

之前的文章有介绍过爬虫(互联网的黄金矿工:爬虫),但只涉及到基本原理,真正去做的时候,你会发现需要综合很多知识。比如说你辛辛苦苦爬到了一个网页的数据,如何快速找出你感兴趣的内容呢?这就要用到正则表达式了。正则表达式太抽象,简单来说就是用来匹配字符串的。匹配字符串的意思是,你先定义一套规则,然后根据这套规则去一个字符串里找那些符合规则的字符串。

你可能会问,这不就是搜索吗?的确,当你在百度上敲入「癌症」两个字的时候,搜索引擎也会在它事先存好的网页里匹配「癌症」这两个字。道理是一样的,但是搜索只能精确的查找某个具体的单词,正则表达式却可以匹配「一类」东西。

比如你定义了一个正则表达式叫d+,表示只要出现一个或多个数字,就匹配成功,就是这个意思。

这有点像你去相亲,先定义了一套正则表达式的规则,比如身高180+、有房有车有车位,然后去相亲网上去找,最后系统给你找到了10个男生,这样就算是匹配成功了。而搜索的话,你就需要精确的输入你想找的人的姓名,然后匹配的结果也很可能只有一个。

介绍完概念,现在就要进入正题了,如何写一个正则表达式?

我们从最简单的开始。假如你想匹配一个词「play」,那么你就写正则表达式「play」,如果你的字符串为「play game」,恭喜你,匹配成功。

但是,「play」这个正则表达式也会匹配到「player」、「playboy」之类的,而你只想找单独存在的单词「play」,那你需要在你的表达式里加上b,它的意思是单词的分界。然后你的表达式就成了「bplayb」。

b被称为元字符,元字符是从普通字符里选出来的特殊字符,有着特殊的含义。

比如w,可以代表一个单词和数字。

再比如d,可以代表一个数字。

还有s,表示空白符。

还有「.」,可以匹配任意字符。

现在,如果我要匹配8位数的QQ号码,你可以写成dddddddd。

好麻烦啊,要匹配18位的身份证号,是不是要写18个d呢?还好,我们有表示数量的限定符,比如「{ }」。18位的身份证号(只考虑数字)可以写成d{18}.

类似的,还有「*」,表示任意数目。还有「+」,表示最少1个。还有「?」,表示最多1个。

现在你要匹配一个小数,例如3.1415926,你可以用这样的正则表达式:「d+.d*」。

解释一下,前两个d+很好理解,表示小数点前面有至少1个数字。后面d*表示小数点可以有任意个数字。中间的小数点为什么加了一个反斜杠呢?试想一下,如果没有反斜杠,小数点就是一个元字符,用来表示任意字符了。加了反斜杠之后,就回归本意,单纯的表示一个小数点了。

正则表达式还有很多规则,一篇文章讲不完,你们可以先了解下原理,然后去网上找资料。最后说下正则表达式的应用之处吧。

  • 验证用户输入是否合法。昨天的文章讲防范SQL注入的时候,可以用正则表达式来匹配用户提交的表单信息。比如规定用户名只能是数字、字母和下划线,可以用「^w+$」。

  • 从你爬下来的网页数据里提取信息。这个需要分析文章结构,然后找到信息的特征,用正则表达式来提取。

  • 当然,有关部门还可以用正则表达式来过滤敏感词。

正则表达式先讲这么多,下一篇就该进入爬虫正题了。

本文来自给产品经理讲技术(微信公众号:pm_teacher)授权发表,转载请联系原作者,违者必究。