正規表示式
當寫乙個指令碼來自動獲取最新的**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 匹配前乙個字...