反射:利用字元串的形式去對象(預設)中操作(尋找)成員
<code>cat commons.py</code>
<code>cat index.py</code>
以字元串方式導入子產品:
執行個體實質:僞造Web架構的路由系統
getattr,delattr,setattr,hasattr
子產品中的特殊變量:
用于提供對Python解釋器相關的操作:
進度條案例:
用于提供系統級别的操作:
用于加密相關的操作,代替了md5子產品和sha子產品,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
簡介:
就其本質而言,正規表達式(或re)是一種小型的、高度專業化的程式設計語言,(在Python中)它内嵌在Python中,并通過re子產品實作。正規表達式模式被編譯成一系列的位元組碼,然後由用C編寫的比對引擎執行。
字元:
. 比對除換行符以外的任意字元
\w 比對字母或數字或下劃線或漢字
\s 比對任意的空白符
\d 比對數字
\b 比對單詞的開始或結束
^ 比對字元串的開始
$ 比對字元串的結束
次數:
* 重複零次或更多次
+ 重複一次或更多次
? 重複零次或一次
{n} 重複n次
{n,} 重複n次或更多次
{n,m} 重複n到m次
Python提供re子產品,包含所有正規表達式的功能。由于Python的字元串本身也用\轉義,是以要特别注意:
是以我們強烈建議使用Python的r字首,就不用考慮轉義的問題了:
先看看如何判斷正規表達式是否比對:
分組
除了簡單地判斷是否比對之外,正規表達式還有提取子串的強大功能。用()表示的就是要提取的分組(Group)。比如:
^(\d{3})-(\d{3,8})$分别定義了兩個組,可以直接從比對的字元串中提取出區号和本地号碼:
如果正規表達式中定義了組,就可以在Match對象上用group()方法提取出子串來。
注意到group(0)永遠是原始字元串,group(1)、group(2)……表示第1、2、……個子串。
提取子串非常有用。來看一個更兇殘的例子:
這個正規表達式可以直接識别合法的時間。但是有些時候,用正規表達式也無法做到完全驗證,比如識别日期:
<code>'^(0[1-9]|1[0-2]|[0-9])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9])$'</code>
對于’2-30’,’4-31’這樣的非法日期,用正則還是識别不了,或者說寫出來非常困難,這時就需要程式配合識别了。
編譯
當我們在Python中使用正規表達式時,re子產品内部會幹兩件事情:
編譯正規表達式,如果正規表達式的字元串本身不合法,會報錯;
用編譯後的正規表達式去比對字元串。
如果一個正規表達式要重複使用幾千次,出于效率的考慮,我們可以預編譯該正規表達式,接下來重複使用時就不需要編譯這個步驟了,直接比對:
match
執行個體:
search
findall
sub
split
常用正規表達式: