爬蟲前提——正則表達式語法以及在Python中的使用
正則表達式是用來處理字符串的強大工具,他並不是某種編程雲。
正則表達式擁有獨立的承受力引擎,不管什麽編程語言,正則表達式的語法都是一樣的。
正則表達式的匹配過程
1.一次拿出表達式和文本中的字符比較。
2.如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。
3.如果表達式中有兩次或便捷,這個過程會稍微有一些不同。
下面舉例一些符號
[....]
字符集(字符類)。對應的位置可以是字符集中任意字符。字符集中的字符可以豬哥列出,也可以給出範圍,如[abc]或[a-c]。第一個字符如果是^則表示取反,如果[^abc]表示不是abc的其他字符。所有的特殊字符在字符集中都是去某原有的特殊含義。在字符集中如果是用]、-或^,可以在前面加上轉移字符反斜杠\,或把]、-放在第一個字符,把^放在非第一個字符。
預定義字符集(可以寫在字符集[....]中):
\d 數字:[0-9]
\D 非數字:[^\d]
\s 空白符:[<空格>\t\r\n\f\v]
\S 非空白符:[^\s]
\w 單詞字符:[A-Za-z0-9_]
\W 飛單詞字符:[^\w]
數量詞(用在字符或(...)之後)
* 匹配前一個字符0或無限次
+ 匹配前一個次1次或無限次
? 匹配前一個次0次或1次
{m} 匹配前一個字符m次
{m,n} 匹配前一個字符m至n次(多於n次則失敗)
m和n可以省略:若省略m,則匹配0至n次;若省略n,則匹配m至無限次
邊界匹配(不消耗待匹配字符串中的字符)
^ 匹配字符串開頭。在多行模式中匹配每一行的開頭。
$ 匹配字符串末尾。在多行模時匹配每一行的末尾。
\A 僅匹配字符串開頭。
\Z 僅匹配字符串末尾。
\b 匹配\w和\W之間
\B [^\B]
邏輯、分組:
| 代表左右表達式任意匹配一個。(類比於C語言的或語句,它總是先匹配左邊的表達式,一旦成功匹配則跳過匹配右邊的表達式。如果|沒有被包括在()中,則它的範圍是整個正則表達式。)
(...) 被括起來的表達式將作為分組,從表達式左邊開始沒遇到一個分組的左括號‘(‘,編號+1.另外,分數表達式作為一個整體,可以後街數量詞。表達式中僅在該組中有效。
(?P<name>...) 分組,除了原有的編號外再指定一個額外的別名。
\<number> 引用編號為<number>分組匹配到的字符串。
(?P=name) 引用別名為<name>的分組匹配到的字符串。
特殊構造(不作為分組):
(?:...) (...)的不分組版本,用於食用‘|‘或後接數量詞。
(?iLmsux) iLmsux的每個字符代表一個匹配模式,只能用在正則表達式的開頭,可選多個。
(?#...) #後的內容將作為註釋被忽略。
(?=...) 之後的字符串內容需要匹配表達式才能成功匹配。不消耗字符串內容。
(?!...) 之後的字符串內容需要不匹配表達式才能成功匹配。不消耗字符串。
(?<=...) 之前的字符串內容需要匹配表達式才能成功匹配。不消耗字符串內容。
(?<!...) 之前的字符串內容需要不匹配表達式才能成功匹配。不消耗字符串內容。
(?(id/name)yes-pattern|no-pattern) 如果編號為id/別名為name的組匹配到字符串,則需要匹配yes-pattern,否則需要匹配no-=attern。[no-pattern]可省略。
數量詞的貪婪模式與非貪婪模式
正則表達式通常用於在文本中查找匹配的字符串。
貪婪模式:總是嘗試撇皮盡可能多的字符;(Python裏數量詞默認是貪婪的)
非貪婪模式:總是嘗試匹配盡可能少的字符。(在貪婪模式的*或+後加上?,就變成了非貪婪模式)
python中如何使用正則表達式
python中是通過一個叫"re"的包來支持正則表達式。
結果如下:
我們來分析一下pattern = re.compile(r‘\d+\.\d*‘) 這個語句:
\d表示數字[0-9]
+表示重復出現上一次匹配的1次或n次
\.表示字符‘.’
*表示重復出現上一次匹配的0次或n次
r實際上是python告訴編譯器這個字符串中的全部轉義字符失效,按照原始字符串處理。
所以\d+.\d*實際上是表示匹配一些小數的規則。然而這個表達式並不能正確匹配所有的小數,比如‘0.‘這樣的字符也會被匹配,舉這個例子純粹是為了多講幾個符號。
由於我們已經建立好了一個能夠匹配‘\d+.\d*‘規則的pattern對象。
通過pattern的findall方法就能夠匹配到我們想要的字符串。
返回的是一個字符串列表[]。
爬蟲前提——正則表達式語法以及在Python中的使用