python基礎(18):初識模塊、re模塊

1. 認識模塊

常見的場景:一個模塊就是一個包含了python定義和聲明的文件,文件名就是模塊名字加上.py的後綴。html

   但其實import加載的模塊分爲四個通用類別: python

1.使用python編寫的代碼(.py文件)正則表達式

2.已被編譯爲共享庫或DLL的C或C++擴展函數

3.包好一組模塊的包spa

4.使用C編寫並連接到python解釋器的內置模塊code

爲什麼要使用模塊?htm

若是你退出python解釋器而後從新進入,那麼你以前定義的函數或者變量都將丟失,所以咱們一般將程序寫到文件中以便永久保存下來,須要時就經過python test.py方式去執行,此時test.py被稱爲腳本script。blog

隨着程序的發展,功能愈來愈多,爲了方便管理,咱們一般將程序分紅一個個的文件,這樣作程序的結構更清晰,方便管理。這時咱們不單單能夠把這些文件當作腳本去執行,還能夠把他們當作模塊來導入到其餘的模塊中,實現了功能的重複利用。ip

2. re模塊

2.1 導入re模塊

在.py文件的開頭,輸入 import re。內存

2.2 經常使用方法

2.2.1 findall

findall : 匹配全部,每一項都是列表中的一個元素

ret = re.findall('\d+','sjkhk172按實際花費928') # 正則表達式,帶匹配的字符串,flagret = re.findall('\d','sjkhk172按實際花費928') # 正則表達式,帶匹配的字符串,flagprint(ret)

2.2.2 search

search : 只匹配從左到右的第一個,獲得的不是直接的結果,而是一個變量,經過這個變量的group方法來獲取結果。
若是沒有匹配到,會返回None,使用group會報錯。

ret = re.search('\d+','sjkhk172按實際花費928')
print(ret)  # 內存地址,這是一個正則匹配的結果print(ret.group()) # 經過ret.group()獲取真正的結果

ret = re.search('\d','owghabDJLBNdgv')print(ret)print(ret.group())

ret = re.search('\d+','sjkhk172按實際花費928')if ret :   # 內存地址,這是一個正則匹配的結果  print(ret.group()) # 經過ret.group()獲取真正的結果

2.2.3 match

match:從頭開始匹配,至關於search中的正則表達式加上一個^。

ret = re.match('\d+$','172sjkhk按實際花費928')
print(ret)

2.2.4 字符串處理的擴展

split:切割

s = 'alex|taibai|egon|'print(s.split('|'))s = 'alex83taibai40egon25'ret = re.split('\d+',s)print(ret)

sub:替換

ret = re.sub('\d+','H','alex83taibai40egon25')
print(ret)ret = re.sub('\d+','H','alex83taibai40egon25',1) //舊,新,須要替換的,次數print(ret)

subn:返回一個元組,第二個元素是替換的次數

ret = re.subn('\d+','H','alex83taibai40egon25')print(ret)

2.3 re模塊的進階:時間/空間

compile 節省你使用正則表達式解決問題的時間。
編譯正則表達式,編譯成字節碼。
在屢次使用的過程當中,不會屢次編譯。

ret = re.compile('\d+')   # 已經完成編譯了print(ret)res = ret.findall('alex83taibai40egon25')print(res)res = ret.search('sjkhk172按實際花費928')print(res.group())

finditer 節省你使用正則表達式解決問題的空間/內存

ret = re.finditer('\d+','alex83taibai40egon25')
for i in ret:  print(i.group())

2.4 方法總結

findall 返回列表 找全部的匹配項
search  匹配就 返回一個變量,經過group取匹配到的第一個值,不匹配就返回None,group會報錯match   至關於search的正則表達式中加了一個'^'

spilt   返回列表,按照正則規則切割,默認匹配到的內容會被切掉sub/subn 替換,按照正則規則去尋找要被替換掉的內容,subn返回元組,第二個值是替換的次數

compile  編譯一個正則表達式,用這個結果去search match findall finditer 可以節省時間finditer 返回一個迭代器,全部的結果都在這個迭代器中,須要經過循環+group的形式取值 可以節省內存

2.5 分組的使用

s = '<a>wahaha</a>'  # 標籤語言 html 網頁
ret = re.search('<(\w+)>(\w+)</(\w+)>',s)
print(ret.group()) # 全部的結果
print(ret.group(1)) # 數字參數表明的是取對應分組中的內容
print(ret.group(2))
print(ret.group(3))

爲了findall也能夠順利取到分組中的內容,有一個特殊的語法,就是優先顯示分組中的內容。

s = '<a>wahaha</a>'
ret = re.findall('(\w+)',s)
print(ret)
ret = re.findall('>(\w+)<',s)
print(ret)

取消分組優先(?:正則表達式)

ret = re.findall('\d+(\.\d+)?','1.234*4')
print(ret)
ret = re.findall('\d+(?:\.\d+)?','1.234*4')
print(ret)

對於正則表達式來講,有些時候咱們須要進行分組,來總體約束某一組字符出現的次數。

(\.[\w]+)?

對於python語言來講,分組能夠幫助你更好更精準的找到你真正須要的內容。

<(\w+)>(\w+)</(\w+)>

python 和 正則表達式 之間的特殊的約定。

分組命名:

(?P<這個組的名字>正則表達式)

s = '<a>wahaha</a>'
ret = re.search('>(?P<con>\w+)<',s)print(ret.group(1))print(ret.group('con'))

 

s = '<a>wahaha</a>'pattern = '<(\w+)>(\w+)</(\w+)>'ret = re.search(pattern,s)print(ret.group(1) == ret.group(3))

使用前面的分組,要求使用這個名字的分組和前面同名分組中的內容匹配的必須一致

pattern = '<(?P<tab>\w+)>(\w+)</(?P=tab)>'
ret = re.search(pattern,s)print(ret)
相關文章
相關標籤/搜索