爬蟲系列(五) re的基本使用

一、簡介

究竟什麼是正則表達式 (Regular Expression) 呢?能夠用下面的一句話簡單歸納:html

正則表達式是一組特殊的 字符序列,由一些事先定義好的字符以及這些字符的組合造成,經常用於 匹配字符串python

在 Python 中,re 模塊 就是一個用於處理正則表達式的模塊,詳細信息能夠參考 官方文檔正則表達式

另外,這裏再給你們推薦一個博主經常使用的測試正則表達式的網站:http://tool.oschina.net/regex,不妨一試網絡

二、特殊符號

上面說過,正則表達式其實是由一些事先定義好的字符以及這些字符的組合造成測試

那麼,這些特殊的字符究竟包括什麼呢?它們又有怎樣的含義呢?具體請看下面的講解:網站

  • .:匹配除換行符以外的 全部字符url

  • ^:匹配字符串的 開始位置spa

  • $:匹配字符串的 結束位置.net

  • *:匹配字符串 零次或屢次,在後面加上 ? 表示啓用非貪婪模式匹配(默認爲貪婪模式)翻譯

  • +:匹配字符串 一次或屢次,在後面加上 ? 表示啓用非貪婪模式匹配(默認爲貪婪模式)

  • ?:匹配字符串 零次或一次,在後面加上 ? 表示啓用非貪婪模式匹配(默認爲貪婪模式)

  • { }:匹配字符串 指定次

    • {M, N} 表示匹配字符串 M~N 次

    • {M,} 表示匹配字符串至少 M 次

    • {,N} 表示匹配字符串至多 N 次

    • {N} 表示匹配字符串 N 次

  • [ ]:匹配 括號內所包含的任意一個字符

    • 若連字符 (-) 出如今字符串中間則表示範圍,出如今首位則做普通字符;

    • 若脫字符 (^) 出如今字符串首位則表示排除,出如今中間則做普通字符

  • ( )捕獲子組,將括號中的匹配模式做爲一個總體被捕獲,並做爲子組返回

  • (?: )非捕獲子組,將括號中的匹配模式做爲一個總體被捕獲,但不做爲子組返回

  • \b:匹配一個 單詞邊界,單詞被定義成字母數字或下橫線字符

  • \B:與 \b 相反

  • \d

    • 對於 str 類型,匹配任何 數字字符,包括 [0-9] 以及其它數字字符

    • 對於 str 類型開啓 re.ASCII 標誌或者 bytes 類型,只匹配 [0-9]

  • \D:與 \d 相反

  • \s

    • 對於 str 類型,匹配任何 空白字符,包括 [\t\n\r\f\v] 以及其它空白字符

    • 對於 str 類型開啓 re.ASCII 標誌或者 bytes 類型,只匹配 [\t\n\r\f\v]

  • \S:與 \s 相反

  • \w

    • 對於 str 類型,匹配任何 單詞字符,包括 [a-zA-Z0-9_] 以及其它單詞字符

    • 對於 str 類型開啓 re.ASCII 標誌或者 bytes 類型,只匹配 [a-zA-Z0-9_]

  • \W:與 \w 相反

下面咱們來看一個簡單的例子,幫助你們更好的理解正則表達式的匹配方式

匹配整數

^ 匹配開頭

-? 匹配減號字符,零次或一次,對應正整數和負整數

[1-9] 匹配 1~9 之間的任意一個數字,確保整數的第一個數字不能爲 0

\d* 匹配任意數字字符,零次或屢次

$ 匹配結尾

^-?[1-9]\d*$

三、經常使用方法

(1)match(pattern, string, flags=0)

在 string 起始位置開始匹配 pattern,flags 表示標誌位

若匹配成功則返回 SRE_Match 對象,若匹配不成功則返回 None 對象

_sre.SRE_Match 對象經常使用的方法列舉以下:

  • start([group]):返回匹配開始的位置
  • end([group]):返回匹配結束的位置
  • span([group]):返回匹配的範圍
  • group(num=0):返回匹配的字符串,若對象中有子組,則加上 num 參數可獲取相應子組
>>> import re
>>> result = re.match(r'abc(\d+)', "abc123def456abc789")
>>> type(result)
# <class '_sre.SRE_Match'>
>>> result.start() # 查看匹配的起始位置
# 0
>>> result.end() # 查看匹配的結束位置
# 6
>>> result.span() # 查看匹配的範圍
# (0, 6)
>>> result.group() # 查看匹配的字符串
# 'abc123'
>>> result.group(1) # 查看匹配的子組
# '123'

(2)search(pattern, string, flags=0)

在 string 中搜索第一次出現的 pattern,flags 表示標誌位

一樣的,若匹配成功則返回 SRE_Match對象,若匹配不成功則返回 None對象

>>> import re
>>> result = re.search(r'abc(\d+)', "abc123def456abc789")
>>> type(result)
# <class '_sre.SRE_Match'>
>>> result.span() # 查看匹配的範圍
(0, 6)

(3)findall(pattern, string, flags=0)

在 string 中搜索全部符合條件的 pattern,flags 表示標誌位

通常狀況下,該方法返回匹配內容的 列表,若匹配模式中含有子組,則返回對應的子組列表

>>> import re
>>> result = re.findall(r'abc\d+', "abc123def456abc789") # 不含子組
>>> type(result)
# <class 'list'>
>>> for item in result:
        print(item)
# abc123
# abc789
>>> result = re.findall(r'abc(\d+)', "abc123def456abc789") # 含有子組
>>> type(result)
# <class 'list'>
>>> for item in result:
        print(item)
# 123
# 789

(4)finditer(pattern, string, flags=0)

在 string 中搜索全部符合的 pattern,flags表示標誌位

通常狀況下,該方法返回匹配內容的 迭代器對象

>>> import re
>>> result = re.finditer(r'abc(\d+)', "abc123def456abc789")
>>> type(result)
# <class 'callable_iterator'>
>>> for item in result:
        print(item)
# <_sre.SRE_Match object; span=(0, 6), match='abc123'>
# <_sre.SRE_Match object; span=(12, 18), match='abc789'>

(5)compile(pattern, flags=0)

編譯正則表達式模式爲正則表達式對象

一般狀況下,若是須要重複使用某個正則表達式,那麼能夠先將該正則表達式編譯成模式對象,如下是參數說明:

  • pattern :匹配模式,建議使用原始字符串表示

  • flags :標誌位,用於控制正則表達式的匹配方式,可選值以下,多個值之間用 | 分割:
    • re.I  re.IGNORECASE:不區分大小寫
    • re.L  re.LOCALE:取決於當前語言環境
    • re.S  re.DOTALL:使 . 匹配包括換行符在內的全部字符
    • re.M  re.MULTILINE:使 ^ 匹配字符串的開頭和每行的開頭,使 $ 匹配字符串的結尾和每行的結尾

該方法返回一個 SRE_Pattern對象,該對象經常使用的方法以下:

  • match(string[, pos[, endpos]])

    用對象中的匹配模式匹配 string 的起始位置,該方法返回 SRE_Match 對象,用 pos 和 endpos 表示匹配的範圍

  • search(string[, pos[, endpos]])

    用對象中的匹配模式匹配 string,該方法返回 SRE_Match 對象,用 pos 和 endpos 表示匹配的範圍

  • findall(string[, pos[, endpos]])

    用對象中的匹配模式匹配 string,該方法返回列表,用 pos 和 endpos 表示匹配的範圍

  • finditer(string[, pos[, endpos]])

    用對象中的匹配模式匹配 string,該方法返回迭代器,用 pos 和 endpos 表示匹配的範圍

【參考資料】

【爬蟲系列相關文章】

相關文章
相關標籤/搜索