Python 正則表達式

圖片來自 unsplash

我們能夠使用 urllib 向網頁請求并獲取其網頁數據。但是抓取信息數據量比較大,我們可能需要其中一小部分數據。對付剛才的難題,就需要正則表達式出馬了。正則表達式能幫助我們匹配過濾到我們需要的數據,但它學習起來非??菰餆o味。你可能會說,我還沒有開始想學習正則表達式,你就來打擊我? 莫慌!層層遞進地學習,一步一個腳印地學習,很快就會學會了。對于爬蟲,我覺得學會最基本的符號就差不多了。

1 正則表達式

下面是一張關于正則表達式字符的圖,圖片資料來自CSDN。先把圖中字符了解清楚,基本上算是入門。


點擊查看大圖

2 re 模塊

Python 自1.5版本起通過新增 re (Regular Expression 正則表達式)模塊來提供對正則表達式的支持。使用 re 模塊先將正則表達式填充到 Pattern 對象中,再把 Pattern 對象作為參數使用 match 方法去匹配的字符串文本。match 方法會返回一個 Match 對象,再通過 Match 對象會得到我們的信息并進行操作。下面介紹幾個 re 常用的函數。

2.1 compile 函數

compile 是把正則表達式的模式和標識轉化成正則表達式對象,供 match() 和 search() 這兩個函數使用。它的函數語法如下:

re.compile(pattern[, flags])
  • 第一個參數是pattern,指的正則表達式。
  • 第二個參數flags是匹配模式,是個可選參數。可以使用按位或'|'表示同時生效,也可以在正則表達式字符串中指定。匹配模式有以下幾種:
flag 描述
re.I(全拼:IGNORECASE) 忽略大小寫(括號內是完整寫法,下同)
re.M(全拼:MULTILINE) 多行模式,改變'^'和'$'的行為(參見上圖)
re.S(全拼:DOTALL) 點任意匹配模式,改變'.'的行為
re.L(全拼:LOCALE) 使預定字符類 \w \W \b \B \s \S 取決于當前區域設定
re.U(全拼:UNICODE) 使預定字符類 \w \W \b \B \s \S \d \D 取決于unicode定義的字符屬性
re.X(全拼:VERBOSE) 詳細模式。這個模式下正則表達式可以是多行,忽略空白字符,并可以加入注釋。
  • 該方法返回的結果是一個 Pattern 對象。

2.2 match 函數

match()函數只在字符串的開始位置嘗試匹配正則表達式,也就是說只有在 0 位置匹配成功的話才有返回。如果不是開始位置匹配成功的話,match() 就返回 none。它的函數語法如下:

re.match(pattern, string[, flags])
  • 第一個參數:匹配的正則表達式
  • 第二個參數:要被匹配的字符串
  • flags 是可選參數,跟 compile 用法相似
  • 匹配成功 re.match 方法返回一個匹配的對象,否則返回None。要想獲得匹配結果,既可以使用groups()函數獲取一個包含所有字符串的元組(從 1 到 所含的小組號),也可以使用group(組號)函數獲取某個組號的字符串。

match 函數用法的示例代碼:

import re

pattern = re.compile('Python')
text = 'Python python pythonn'
match = re.search(pattern, text)
if match:
    print(match.group())
else:
    print('沒有匹配')

2.3 search 函數

search() 函數是掃描整個字符串來查找匹配,它返回結果是第一個成功匹配的字符串。

re.search(pattern, string[, flags])

參數用法以及返回結果跟match函數用法相同。

search 函數用法的示例代碼:

import re

pattern = re.compile('Python')
text = 'welcome to Python world!'
match = re.search(pattern, text)
if match:
    print(match.group())
else:
    print('沒有匹配')

2.4 findall 函數

findall函數在字符串中搜索子串,并以列表形式返回全部能匹配的所有子串。

re.findall(pattern, string[, flags])

參數用法以及返回結果跟match函數用法相同。

findall 函數用法的示例代碼:

import re

pattern = re.compile('\d+')
text = 'one1two2three3four4'
list = re.findall(pattern, text)
if list:
    print(list)
else:
    print('沒有匹配')

上篇文章:詳解 python3 urllib
推薦閱讀:學爬蟲之道


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容