4、認識正則表達式和re庫

regular expression regex   RE

正則表達式:是用來簡潔表達一組字符串的表達式(一行勝千言)。




正則表達式:
  • 通用的字符串表達框架(就像數學規律題的公式)
  • 簡潔表達一組字符串
  • 針對字符串表達“簡潔”“特徵”思想的工具
  • 判斷某字符串的特徵歸屬
作用:
  1. 表達文本類型的特徵(病毒,入侵等)
  2. 查找或替換一組字符串
  3. 匹配字符串(主要作用)
使用:
編譯:將符合正則表達式語法的字符串轉換成正則表達式特徵

2、正則表達式的語法
正則表達式:有字符和操作符構成,eg:P(Y|YT|YTH|YTHO)?N

[^]                        #排除某個字符
*和+的區別            #有無0次擴展
|                            #或符號









匹配IP地址的正則表達式:(IP地址分4段,每段0-255)
\d+.\d+.\d+.\d+.
\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}.           
但是以上都不精確
精確寫法:
0-99: [1-9]?\d      
100-199:1\d{2}
200-249:2[0-4]\d
250-255:25[0-5]
(([1-9]?\d |1\d{2} |2[0-4]\d |25[0-5] ).){3}([1-9]?\d |1\d{2} |2[0-4]\d |25[0-5] )

3、Re庫的基本使用
Re庫是Pyhton的標準庫,主要用於字符串匹配
Re庫是採用raw string 類型的正則表達式,其形式爲 r'*****'          #紅色部分填入正則表達式
例如:
我國郵編: r'[1-9]\d{5}'
注意: raw string 是不包含轉義字符的的字符串
Re庫的主要功能函數

re.search(pattern,string,flags = 0)           #在一個字符串中搜索匹配正則表達式的第一個位置,返回match對象

pattern:     正則表達式的字符串或原生字符串表示
string:     待匹配字符串
flag:     正則表達式使用時的控制標記

eg:
import re
match = re.search(r'[1-9]\d{5}''yangpu 200433')
if match:
      print(match.group(0))
結果輸出:
200433

re.match(pattern,string,flags = 0)          #從一個字符串的開始位置起匹配正則表達式,返回match對象
參數解釋同上
eg:
import re
#注意,match,從頭開始匹配,如若'yangpu 200433',匹配結果應該爲空
match = re.match(r'[1-9]\d{5}''200433 yangpu')    
if match:
      print(match.group(0))
結果輸出:
200433

re.findall(pattern,string,flags = 0)       #搜索字符串,以列表類型返回全部能匹配的子串
參數解釋同上
eg:
import re
list = re.findall(r'[1-9]\d{5}''200433 yangpu 510006 gzdxc')
print(list)
結果輸出:
['200433', '510006']

re.split(pattern,string,maxsplit = 0,flags = 0)         #將一個字符串按照正則表達式匹配結果進行分割,返回列表類型

maxsplit:     最大分割數,剩餘部分作爲最後一個元素輸出
其他參數解釋同上
eg:
import re
list = re.split(r'[1-9]\d{5}''yangpu 200433  gzdxc 510006')
list2 = re.split(r'[1-9]\d{5}''yangpu 200433 gzdxc 510006',maxsplit=1)
print(list,'\n',list2)
結果輸出:
['yangpu ', '  gzdxc ', '']
 ['yangpu ', ' gzdxc 510006']

re.finditer (pattern,string,flags = 0)           #搜索字符串,返回一個匹配結果的迭代類型,每個迭代元素是match對象
參數解釋同上
eg:
import re
for in re.finditer(r'[1-9]\d{5}''yangpu 200433  gzdxc 510006'):
      if m:
            print(m.group(0))
結果輸出:
200433
510006

re.sub(pattern,repl,string,count = 0,flags = 0)         #在一個字符串中替換所匹配正則表達式的子串,返回替換後的字符串

repl:     替換匹配字符串的字符串
count:     匹配替換的最大次數
其他參數解釋同上
eg:
import re
chg = re.sub(r'[1-9]\d{5}','zipcode','yangpu 200433  gzdxc 510006')
print(chg)
結果輸出:
yangpu zipcode  gzdxc zipcode


Re庫的另一種等價用法:
上述爲函數式用法:rst = re.search(r'[1-9]\d{5}','yangpu 200433')
等價於

面向對象用法:
pat = re.compile(r'[1-9]\d{5}' )
rst = pat.search('yangpu 200433' )
#這樣會使得代碼更加簡潔,不用每次都要寫上正則表達式

re.compile(pattern,flags = 0)     #將正則表達式的字符串形式編譯成正則表達式對象

pattern:     正則表達式的字符串或原生字符串表示
flag:     正則表達式使用時的控制標記

regex = re.compile(pattern,flags = 0)
那麼regex正則表達式對象就可以使用以下6種方法/函數,此時,不需要給出pattern參數,將該參數去掉即可


4、Re庫的match對象

match對象:     一次匹配的結果,其包含很多相關信息
import re
chg = re.search(r'[1-9]\d{5}','yangpu 200433  gzdxc 510006')
if chg:
      print(chg)
結果:
<_sre.SRE_Match object; span=(7, 13), match='200433'>

match對象的屬性


match對象的方法




5、Re庫的貪婪匹配和最小匹配

貪婪匹配:返回匹配中的最長子串;Re庫默認貪婪匹配
eg:
import re
chg = re.search(r'PP.*N','PPANBNCNDNENFNGN')
if chg:
      print(chg.group(0))
結果爲:
PPANBNCNDNENFNGN

那麼要獲得最小匹配,也就是匹配中的最短子串,則需加個?   #前一個字符0或1次擴展
import re
chg = re.search(r'PP.*?N','PPANBNCNDNENFNGN')
if chg:
      print(chg.group(0))
結果爲:
PPAN

也就是說,要獲得最小匹配,只要將正則表達式稍微修改一下,加個?


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章