爬蟲之正規表示式search 用法

2021-09-08 20:12:56 字數 3404 閱讀 9448

一 match()的不足

1 點睛

match()方法是從字串的開頭開始匹配的,一旦開頭不匹配,那麼整個匹配就失敗了。

2 **

import re

# 這裡的字串以extra開頭,但是正規表示式以hello開頭,

# 整個正規表示式是字串的一部分,但是這樣匹配是失敗的。

content = 'extra stings hello 1234567 world_this is a regex demo extra stings'

result = re.match('hello.*?(\d+).*?demo', content)

print(result)

3 結果

e:\webspider\venv\scripts\python.exe e:/webspider/3_3.py

none

4 說明

因為match()方法在使用時需要考慮到開頭的內容,這在做匹配時並不方便。它更適合用來檢測某個字串是否符合某個正規表示式的規則。

二 search()方法的引入

1 點睛

方法search(),它在匹配時會掃瞄整個字串,然後返回第乙個成功匹配的結果。也就是說,正規表示式可以是字串的一部分,在匹配時,search()方法會依次掃瞄字串,直到找到第乙個符合規則的字串,然後返回匹配內容,如果搜尋完了還沒有找到,就返回none。

2 **

import re

# 這裡的字串以extra開頭,但是正規表示式以hello開頭,

# 整個正規表示式是字串的一部分,但是這樣匹配是失敗的。

content = 'extra stings hello 1234567 world_this is a regex demo extra stings'

# result = re.match('hello.*?(\d+).*?demo', content)

# 將match換成search

result = re.search('hello.*?(\d+).*?demo', content)

print(result)

3 結果

e:\webspider\venv\scripts\python.exe e:/webspider/3_3.py

<_sre.sre_match object; span=(13, 53), match='hello 1234567 world_this is a regex demo'>

4 說明

為了匹配方便,我們可以盡量使用search()方法。

三 實戰

1 需要爬取的文字

html = '''經典老歌列表

'''

2 需求

可以觀察到,ul節點裡有許多li節點,其中li節點中有的包含a節點,有的不包含a節點,a節點還有一些相應的屬性——超連結和歌手名。

首先,我們嘗試提取class為active的li節點內部的超連結包含的歌手名和歌名,此時需要提取第三個li節點下a節點的singer屬性和文字。

3 分析

此時正規表示式可以以li開頭,然後尋找乙個標誌符active,中間的部分可以用.*?來匹配。接下來,要提取singer這個屬性值,所以還需要寫入singer="(.*?)",這裡需要提取的部分用小括號括起來,以便用group()方法提取出來,它的兩側邊界是雙引號。然後還需要匹配a節點的文字,其中它的左邊界是》,右邊界是。然後目標內容依然用(.*?)來匹配,所以最後的正規表示式就變成了:

(.*?)
然後再呼叫search()方法,它會搜尋整個html文字,找到符合正規表示式的第乙個內容返回。

另外,由於**有換行,所以這裡第三個引數需要傳入re.s。

4 **

html = '''經典老歌列表

'''import re

result = re.search('(.*?)', html, re.s)

if result:

print(result.group(1), result.group(2))

5 執行結果

e:\webspider\venv\scripts\python.exe e:/webspider/3_3.py

齊秦 往事隨風

6 說明

由於需要獲取的歌手和歌名都已經用小括號包圍,所以可以用group()方法獲取。

可以看到,這正是class為active的li節點內部的超連結包含的歌手名和歌名。

7 去掉正規表示式中的 active

import re

# result = re.search('(.*?)', html, re.s)

# 去掉active

result = re.search('(.*?)', html, re.s)

if result:

print(result.group(1), result.group(2))

8 結果

e:\webspider\venv\scripts\python.exe e:/webspider/3_3.py

任賢齊 滄海一聲笑

9 說明

把active標籤去掉後,從字串開頭開始搜尋,此時符合條件的節點就變成了第二個li節點,後面的就不再匹配,所以執行結果就變成第二個li節點中的內容。

10 去掉re.s

import re

# result = re.search('(.*?)', html, re.s)

# 去掉active

# result = re.search('(.*?)', html, re.s)

# 去掉re.s

result = re.search('(.*?)', html)

if result:

print(result.group(1), result.group(2))

11 結果

e:\webspider\venv\scripts\python.exe e:/webspider/3_3.py

beyond 光輝歲月

12 說明

可以看到,結果變成了第四個li節點的內容。這是因為第二個和第三個li節點都包含了換行符,去掉re.s之後,.*?已經不能匹配換行符,所以正規表示式不會匹配到第二個和第三個li節點,而第四個li節點中不包含換行符,所以成功匹配。

由於絕大部分的html文字都包含了換行符,所以盡量都需要加上re.s修飾符,以免出現匹配不到的問題。

正規表示式search方法應用

一 search方法介紹 返回與正規表示式查詢內容匹配的第乙個子字串的位置。語法 stringobj.search rgexp stringobj 必選項。要在其上進行查詢的 string 物件或字串文字。rgexp 必選項。包含正規表示式模式和可用標誌的正規表示式物件。說明 search方法指明是...

爬蟲 正規表示式

正規表示式 regular expression 是一種字串匹配的模式 pattern 它可以檢查乙個字串是否含有某種子串 替換匹配的子串 提取某個字串中匹配的子串。匯入正則模組 importre 字元匹配 rs re.findall abc adc print rs rs re.findall a...

python爬蟲之正規表示式

search函式 import re re庫 pattern re.compile r worlda compile編譯生成可操作物件 m re.search pattern,hello world search的結果有一些屬性,其 中group 返回 如果查詢成功,則返回匹配的段落 if m pr...