python正則表達式學習

前言

最近在用django做一個功能,主要是爲實現機器監控,這個過程當中,涉及url識別IP路由問題,一開始用了各類表達方式都沒法正確路由到IP,說明本身對這塊仍是有不少不熟悉的地方,本文主要是針對Python的正則表達式展開介紹,以做備忘。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的正則用法仍是很豐富的,若是能學好,在各個方面都很方便能解決實際問題。

相關文章
相關標籤/搜索