我們的《從零開始學爬蟲》專欄發布後,目前已經更新了三篇:
今天我們來介紹一個在爬蟲中非常重要的工具:正則表達式。正則表達式是一個特殊的符號系列,它能夠幫助開發人員檢查一個字符串是否與某種模式匹配。
本篇文章涉及以下內容:
正則表達:學會正則表達式的常用符號。
Python的re模塊的使用
介紹re在爬蟲中的運用
正則表達基礎 1. 行定位符行定位符就是用來描述子串的邊界。^ 表示行的開始,$ 表示行的結尾。
例如:
^py
這個表達式表示匹配子串py的開始位置是行頭, 如:"python"就是可以匹配到的,而"Java and py"則不匹配。
但是如果使用:
py$
則是可以匹配的。
如果要匹配子串可以出現在字符串的任意部分,那麼可以直接寫成:
py
2. 元字符我們常用的主要有以下幾種,大家先了解一下,後面的爬蟲中會慢慢講解。
代碼說明.匹配除換行符以外的任意字符\w匹配字母,數字,下劃線或漢字\W匹配除字母,數字,下劃線或漢字以外的內容\s匹配單個的空白符(包括<TAB>鍵和換行符)\S匹配除單個的空白符(包括<TAB>鍵和換行符)以外的所有字符\d匹配數字\b匹配單詞的開始或結束,單詞的分界符通常是空格,標點符號或者換行^匹配字符串的開始$匹配字符串的結尾比如下面的這個表達式:
\bgo\w*\b
它用於匹配以字母go開頭的單詞。
類似:goto, google, gogo123這樣的都可以被匹配到。但是像:bo,to這樣的單詞是匹配不到的。因為不是go開頭的。
3. 限定符常用的限定符:
限定符說明舉例?匹配前面的字符零次或一次colou?r,該表達式可以匹配color和colour+匹配前面的字符一次或多次go+gle,該表達式可以匹配的範圍從gogle到goo…gle*匹配前面的字符零次或者多次go*gle,該表達式匹配的範圍從ggle到goo…gle{n}匹配前面的字符n次go{2}gle,該表達式只匹配google{n,}匹配前面的字符最少n次go{2,}gle,該表達式匹配範圍從google到goo…gle{n,m}匹配前面的字符最少n次,最多m次employe{0, 2},該表達式匹配employ,employe和employee3種情況4. 選擇字符我們通常使用 | 來實現選擇,比如我們的身份證號有15位和18位的,那怎麼匹配呢?
(^\d{15}$)|(^\d{18}$)|(^\d{17})(\d|X|x)$
這個的意思式要麼是15個數字,要麼是18個數字或者17個數字加一個x(大寫,小寫)
這裡的括號表示分組。
Python Re模塊我們可以通過下面的代碼導入re庫
import re
match()方法用於從字符串的開始處進行匹配,如果在起始位置匹配成功,則返回Match對象,否則返回None,語法如下
re.match(pattern, string, [flags])
比如匹配字符串是否以"py"開頭,不區分大小寫代碼如下
import re
pattern = r'py\w+'
string = 'python is PYTHON'
match = re.match(pattern, string, re.I)
print(match)
string = "這是python"
match = re.match(pattern, string, re.I)
print(match)
因為match是用字符串的開頭開始匹配的,因為"這是python"這個字符串不是py開始的。所以返回的是None。span這個元組表示匹配的位置,第一個為開始位置,第二個為結束位置。
import re
pattern = r'py\w+'
string = 'python is PYTHON'
match = re.match(pattern, string, re.I)
print(match)
print("匹配的起始位置:", match.start())
print("匹配的結束位置:", match.end())
print("匹配的元組:", match.span())
print("匹配的字符:", match.string)
print("匹配的數據:", match.group())
search()方法用於在整個字符串中搜索第一個匹配的值,找到就返回Match對象,否則返回None,語法如下:
re.search(pattern, string, [flags])
import re
pattern = r'py\w+'
string = 'python is PYTHON'
match = re.search(pattern, string, re.I)
print(match)
string = "這是python"
match = re.search(pattern, string, re.I)
print(match)
從運行結果可以看出,這個方法不僅僅在字符串的起始位置搜索,其他位置有符合的匹配也可以。
3. 使用findall()方法進行匹配findall()方法用於在整個字符串中搜索所有符合正則表達式的字符串,並以列表的形式返回。查找不到就返回空列表。
re.findall(pattern, string, [flags])
import re
pattern = r'py\w+'
string = 'python is PYTHON'
match = re.findall(pattern, string, re.I)
print(match)
string = "這是python"
match = re.findall(pattern, string, re.I)
print(match)
sub方法用於實現字符串替換。在爬蟲中很少會用到。等遇到後和大家分享。
5. 用split()方法分割字符串import re
pattern = r'[?|&]'
url = 'https://search.bilibili.com/live?keyword=IT蝸殼'
result = re.split(pattern, url)
print(result)
這裡用?將url分割了兩部分
好了,今天的分享就是這些了,我們下期見。
另外,我們成立了這個爬蟲專欄的讀者交流群,如果有問題歡迎大家在群裡積極討論。還沒有加入的同學可以掃描下方的微信二維碼,添加微信好友,之後統一邀請你加入交流群。添加好友時一定要備註:爬蟲。