最近在用django做一個功能,主要是爲實現機器監控,這個過程當中,涉及url識別IP路由問題,一開始用了各類表達方式都沒法正確路由到IP,說明本身對這塊仍是有不少不熟悉的地方,本文主要是針對Python的正則表達式展開介紹,以做備忘。python
學過Python的都知道,python中有一個正則表達式的模塊: re. 正則匹配的模式主要有如下幾類:正則表達式
x? 匹配0個或1個x,最多1個 x+ 匹配1個或多個x,至少1個 x* 匹配0個或多個x x{m,n} 匹配m與n之間個數的x,如{2,4},則可匹配到xx,xxx,xxxx x|y 匹配x或y ^ 匹配文本開頭 $ 匹配文本結尾 [a-zA-Z] 匹配26個字母的大小寫 [^a-zA-Z] 匹配非26個字母的其它字符 [0-9] 匹配0-9之間的全部數字 \d 匹配數字 \D 不匹配數字 \w 匹配任意字母 \W 匹配任意除字母外的其它字符 \s 匹配空格 \S 不匹配空格
若是我要匹配一個郵件地址,該怎麼作呢,咱們先看下下面代碼:express
import re x="[a-z]+@[a-z]+.[a-z]+" s1='liran@devarea.com' s2='liran#devarea.com' c=re.match(x,s1) if c: print ('ok') else: print ('no')
先定義一個模式匹配串[a-z]+@[a-z]+.[a-z]+
, 這個模式串主要含義以下:django
匹配一個字母組成的子串,至少1個字母組成 – [a-z]+
匹配一個符號 – @
匹配一個字母組成的子串,至少1個字母組成 – [a-z]+
匹配一個標點 – .
匹配一個字母組成的子串,至少1個字母組成 – [a-z]+函數
從上面能夠看出,其它這個匹配方式是很簡單的,能夠匹配一些簡單模式的郵件,若是郵件中包含數字和大寫字母呢,也很簡單,只要在匹配中加下數字的匹配就行,以下所示:this
x="[a-zA-Z0-9]+@[a-zA-Z0-9]+.[a-zA-Z0-9]+"
若是要匹配特定後綴的郵件地址要如何呢,也比較簡單,直接在模式串最後加特定後綴的子串就行,如咱們要匹配.com,net之類的,咱們能夠以下方式來匹配:url
x=[a-zA-Z0-9]+@[a-z0-9]+.(net|com)
還有一些更復雜的方式,如包含一些特殊字符的郵件地址,以下所示:code
pattern="^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]*$"
除了郵箱地址,咱們常常須要去判斷如電話號碼,IP地址之類的,以下所示:
IP地址ip
ip="^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"
電話號碼ci
phone = "'(\d{3}[-\.\s]??\d{3}[-\.\s]??\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]??\d{4}|\d{3}[-\.\s]??\d{4})'"
還有多是在爬蟲時須要去匹配合歸的URL連接,以下所示:
url='http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
在實際Python應用中,咱們也常常會用到正則查找功能,如查找文本中第一次出現的數字,能夠以下用:
str = 'hello,this is 888, my first regular expression 999 exercise' m = re.search(r"[0-9]+", str) if m: print('匹配: ',m.group()) #輸出: 888
若是要匹配文本中全部數字呢,能夠用findall
函數,以下所示:
str='hello,this is 888, my first regular expression 999 exercise' m=re.findall(r"[0-9]+",str) print m #輸出: ['888','999']
因此用re仍是很方便找到想要的子串的。
在實際使用中,正則替換也是很常見,用re的sub函數
也能很方便解決。如我想把上面字符串中的數字所有替換成*,咱們能夠用以下方式來解決:
str = 'hello,this is 888, my first regular expression 999 exercise' new_str = re.sub('[0-9]+', '*', str) print new_str # 輸出: hello,this is *, my first regular expression * exercise
若是要輸出替換了多少處數字,能夠用subn
函數,其返回一個兩個元素的元組,第一個是替換後字符串,第二個是替換的次數,用法以下:
str='hello,this is 888, my first regular expression 999 exercise' new_str = re.subn('[0-9]+','*',str) print new_str #輸出: ('hello,this is *, my first regular expression * exercise', 2)
對於一個文本,若是咱們想按指定子串將整個文件分割,能夠用split
函數,返回一個列表,具體用法以下:
str = 'hello,this is 888, my first regular expression 999 exercise’ new_str = re.split('[0-9]+',str) print new_str #輸出: [ 'hello,this is ' , ', my first regular expression ' , ' exercise' ]
固然,若是用於分割的子串不固定,好比包含各類特殊字符,以下示例所示:
str = 'hello#,this is my&first$expression' new_str = re.split('[#,&$]',str) print new_str #輸出: [ 'hello' , 'this is my' , 'first' , 'expression' ]
因此,只要掌握了分割模式,能夠對文本進行任何處理,這在數據挖掘分析中也很用。
python的正則用法仍是很豐富的,若是能學好,在各個方面都很方便能解決實際問題。