一、為什么必須要有正則表達(dá)式
正則表達(dá)式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來(lái)檢查一個(gè)串是否含有某種子串、將匹配的子串替換或者從某個(gè)串中取出符合某個(gè)條件的子串等。
在我們使用xpath和css選擇器時(shí)只能取到html標(biāo)簽下的一段字符串,比如我們要取知乎回答下的時(shí)間,有的是“發(fā)布于 13:57”,有的是“發(fā)布于 昨天 13:50”,還有的是“發(fā)布于 2016-03-17”。如果我們不用正則表達(dá)式,而用其他替代方案,比如多個(gè)if else,或者replace,處理起來(lái)是非常繁瑣的。
本文章將介紹幾種非常常用的特殊字符,學(xué)會(huì)了使用這些字符將會(huì)解決98%爬蟲(chóng)需要做字符串提取的工作。
二、正則表達(dá)式最常見(jiàn)的字符
1)特殊字符:就是一些有特殊含義的字符。 $ () * + . [ ? \ ^ { |
2)限定符:用來(lái)指定正則表達(dá)式的一個(gè)給定組件必須要出現(xiàn)多少次才能滿足匹配。* + ? {n} {n,} {n,m}
3)定位符:用來(lái)描述字符串或單詞的邊界。^ $
4)其他字符:\w \W \s \S \d
我先不介紹這些字符有什么含義,我們直接進(jìn)入python示例
三、正則表達(dá)式的簡(jiǎn)單應(yīng)用及python示例
3.1、介紹^ . * $的用法
1)^ 匹配輸入字符串開(kāi)始的位置。
2). 匹配除換行符 \n 之外的任何單字符。
3)* 匹配前面的子表達(dá)式零次或多次。
4)$ 匹配輸入字符串的結(jié)尾位置。

3.2、介紹() ?用法
1)()標(biāo)記一個(gè)子表達(dá)式的開(kāi)始和結(jié)束位置。
2)?匹配前面的子表達(dá)式零次或一次,或指明一個(gè)非貪婪限定符。

3.3、介紹+ {n} {n,} {n,m}用法
1)+匹配前面的子表達(dá)式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價(jià)于 {1,}。
2){n} n 是一個(gè)非負(fù)整數(shù)。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個(gè) o。
3){n,} n 是一個(gè)非負(fù)整數(shù)。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價(jià)于 'o+'。'o{0,}' 則等價(jià)于 'o*'。
4){n,m} m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個(gè) o。'o{0,1}' 等價(jià)于 'o?'。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格。

3.4、介紹|[123] [0-9] [^1]用法
1)|指明兩項(xiàng)之間的一個(gè)選擇。
2)[123] 只要是123中的其中一個(gè)即可。
3)[0-9] 只要是0-9中的任意數(shù)字即可。
4)[^1] 非,只要不是1即可。

3.5、介紹\s \S \w \W \d用法
1)\s匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于 [ \f\n\r\t\v]。
2)\S匹配任何非空白字符。等價(jià)于 [^ \f\n\r\t\v]。
3)\w 等價(jià)于[A-Za-z0-9_]。
4)\W 與\w相反。
5)\d 所有數(shù)字,等價(jià)于[0-9]。
