19 3 Python入門之正規表示式

2021-08-15 09:02:46 字數 4642 閱讀 4548

正規表示式

當寫乙個指令碼來自動獲取最新的**ip位址,目標url:

很難定位到ip及對應埠的位置,只有class = "sortable"是兩個ip**唯一的特性

產生需求,即通過ip位址特徵(四段數字組成,每段數字範圍0-255,分別由三個點號隔開)來尋找ip位址,正規表示式應運而生,其是描述這些複雜規則的工具

python通過re模組來實現正規表示式

>>>import re

>>>re.search(r'fish','i love fish')

<_sre.ser_match object;span=(7,12),match = 'fish'>

分析:

search()方法用於在字串中搜尋正規表示式模式第一次出現的位置,結果為(7,12)

第乙個引數是正規表示式模式,即描述的搜尋規則,使用原始字串來寫

找到後返回的範圍下標以0開始,找不到,則返回none

萬用字元

萬用字元即可表示任何字元,如所有word型別的檔案為*.docx

正規表示式的萬用字元用點號(.)來表示,可匹配除了換行符的任何字元

>>>re.search(r'.','i love fish')

<_sre.ser_match object;span=(0,1),match = 'i'>

>>>re.search(r'fish','i love fishc')

<_sre.ser_match object;span=(7,12),match = 'fishc'>

反斜槓

若想單單匹配點號,則加上反斜槓,表示消除元字元的特殊功能

>>>re.search(r'\.','i love fish.com')

反斜槓也可以使普通字元擁有特殊能力,如(\d)表示匹配數字

>>>re.search(r'\d','123 i love fish')

<_sre.ser_match object;span=(0,1),match = '1'>

粗糙的匹配乙個ip位址可以如下寫法

>>>re.search(r'\d\d\d.\d\d\d.

\d\d\d.

\d\d\d

','other 192.168.011.111other')

但上述不規範,因為ip數字範圍是0-255,而不是000-999

字元類

字元類用來表述乙個字元的範圍,使用中括號將內容包起來就是字元類,含義是只要匹配到這個字元類的任何字元,結果算作匹配

如想要匹配母音字母,則

>>>>>>re.search(r'[aeiou]','i love fish')

<_sre.ser_match object;span=(3,4),match = 'o'>

因為正規表示式區分大小寫,所以i雖然是母音字母,但是沒有匹配

解決方法:

法一:關閉大小寫敏感模式

法二:修改字元類

>>>>>>re.search(r'[aeiouaeiou]','i love fish')

在中括號內可使用小橫桿來表示範圍,包括數字和字母

>>>>>>re.search(r'[a-z]','i love fish')

>>>>>>re.search(r'[0-2][0-5][0-5]','i love fish')

[01]與[0-1]等價

重複匹配

用大括號對元字元實現重複匹配的功能

>>>re.search(r'abc','abbbc')

<_sre.ser_match object;span=(0,5),match = 'abbbc'>

>>>re.search(r'abc','abbbbbc') #匹配不了

重複的次數取乙個範圍

>>>re.search(r'abc','abbbbbc')

<_sre.ser_match object;span=(0,7),match = 'abbbbbc'>

>>>re.search(r'abc','abbbc')

<_sre.ser_match object;span=(0,5),match = 'abbbc'>

>>>re.search(r'[0-255]','188')

<_sre.ser_match object;span=(0,1),match = '1'>

>>>re.search(r'[0-2][0-5][0-5]','188')

正規表示式匹配的是字串,所以數字對於字元來說只有0-9,123由『1』,『2』,『3』三個字元構成,[0-255]

字元類表示0-2還有兩個5,所以匹配的是0125四個數字中任何乙個

匹配0-255範圍的數字,正確寫法是

>>>re.search(r'[0-1]\d\d\|2[0-4]\d|25[0-5]','188') #000-199,200-249,250-255

<_sre.ser_match object;span=(0,3),match = '188'>

匹配ip位址

>>>re.search(r'([0-1]\d\d|2[0-4]\d|25[0-5]

\.)([01]\d\d|2[0-4]\d|25[0-5]

)',''other192.168.1.other')

表示需要重複匹配三次才成功

上例忽視了1不會寫出001這一點,忽略位數的影響,所以最終版為

re.search(r'(([01]\d\d|2[0-4]\d|25[0-5])

\.)([01]\d\d|2[0-4]\d|25[0-5]

)',''other192.168.1.other')

[01]\d\d

表示最後一位一定要有(沒有的話還叫數字嗎),但百位和十位可有可無

特殊符號及用法

正規表示式以字串的形式描述,其強大之處在於特殊符號,特殊符號定義了字元集合,子組匹配,模式重複次數。

元字元包括 . ^ $ * + ? {} \ | ()

(.)點號表示匹配除換行符外的任何字元

(|)管道符類似邏輯或操作

>>>re.search(r"fish(c|d)","fishc")

<_sre.ser_match object;span=(0,5),match = 'fishc'>

(^)表示匹配字串的開始位置,即目標字串出現在開頭才會匹配

>>>re.search(r"^fish","fish.com")

<_sre.ser_match object;span=(0,4),match = 'fish'>

>>>re.search(r"^fish","i love fish.com")  #none

($)表示匹配字串的結束位置,即目標字串出現在末尾才會匹配

>>>re.search(r"fishc$","love fishc")

<_sre.ser_match object;span=(5,10),match = 'fishc'>

小括號本身是一對元字元,括號內的正規表示式稱為乙個子組,子組可當做乙個整體,例如在後面對其引用

反斜槓

反斜槓若後面數字數1-99,則表示引用序號對應的子組的字串,若後面數字是0開頭或者是三位數字,則表示八進位制數,表示的是八進位制數所對應的ascii碼字元

>>>re.search(r"(fishc)\1","fishcfishc.com")

\1表示引用前邊序號為1的子組(第乙個子組),所以r"(fishc)\1"

相當於r"fishcfishc",所以匹配的是要有連續兩個fishc的內容,才能成功匹配

若\後面新增的是數字0開頭或者三位數,則把這三位數當做乙個八進位制數

>>>re.search(r"\141fishc","afishc.com")

八進位制141對應的ascii碼為小寫字母a

>>>re.search(r"(fishc)\060","fishc0.com")

八進位制060對應的ascii碼為數字0

這對元字元

表明是生成字元類,實際是乙個字元集合,其內部的元字元都失去特殊功能,如同反斜槓加上元字元一樣

>>>re.search(r"[.]","fishc.com")

<_sre.ser_match object;span=(5,6),match = '.'>

字元類內部的元字元都失去特殊功能

,但也有幾個特殊情況

1)小橫槓表示範圍

>>>re.findall(r"[a-z]","fishc.com")

['i','s','h','c','o','m']

>>>findall表示找出所有匹配內容,並將結果返回為乙個列表

2)反斜槓,例如\n表示匹配換行符

3)脫字元(^)表示取反

>>>re.findall(r"[^a-z]","fishc.com")

['f','c','.']

大括號,表示重複次數

"fishc"等價於"fishccc"

(fishc)"等價於"fishcfishcfishc"

(fishc)表示重複的次數為一次或三次,注意間不能有空格

正規表示式不能隨便用空格,表示重複的元字元還有:*,+和?

*表示,+表示,問號表示,同等情況推薦使用這些符號,簡潔且效率比使用大括號高些

python正則入門 一

假設某一行字串為 str1 445 x 1 findall 獲取匹配到的內容 獲取這一行中的數字,python 如下 親測可用 coding utf 8 import re line str1 445 x list re.findall r str1 d line print list 0 列印找到...

Python學習之正則

python學習目錄 在mac下使用python3 python學習之資料型別 python學習之函式 python學習之高階特性 python學習之函式式程式設計 python學習之模組 python學習之物件導向程式設計 python學習之物件導向高階程式設計 python學習之錯誤除錯和測試 ...

python之正則 一

1.常用正規表示式 d 數字 0 9 例項 a dc a1c d 非數字 d 例項 a dc abc s 空白字元 空格 t r n f v 例項 a sc a c s 非空白字元 s 例項 a sc abc w 單詞字元 a za z0 9 例項 a wc abc w 非單詞字元 w 匹配前乙個字...