
正則表達式是一種用來匹配字符串的強有力的武器。它的設計思想是用一種描述性的語言來給字符串定義一個規(guī)則,凡是符合規(guī)則的字符串,我們就認為它“匹配”了,否則,該字符串就是不合法的。
因為正則表達式也是用字符串表示的,所以,我們要首先了解如何用字符來描述字符。
正則表達式匹配:
如果直接給出字符,就是精確匹配。
?\d 可以匹配一個數(shù)字
\w 可以匹配一個字母或數(shù)字
?.?可以匹配任意字符
要匹配變長的字符,在正則表達式中:
用 * 表示任意個字符(包括0個)
用 + 表示至少一個字符
用 ? 表示0個或1個字符
用 {n} 表示n個字符
用 {n,m} 表示n-m個字符
特殊字符 要用'\'轉義
正則表達式實例:
實例1:
\d{3}\s+\d{3,8}
\d{3} 表示匹配3個數(shù)字 ?例如010
\s 匹配一個空格或tab,\s+表示至少有一個空格 例如 ‘ ’
\d{3,8} 表示3-8個數(shù)字,例如‘1234567’
實例2:
‘0574-65972291’
\d{4}\-\d{4,8}
\w
正則表達式進階:
要做更精確地匹配,可以用 [ ] 表示范圍
A|B 可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'
^表示行的開頭,^\d表示必須以數(shù)字開頭,$表示行的結束,\d$表示必須以數(shù)字結束。
re模塊
Python提供re模塊,包含所有正則表達式的功能。由于Python的字符串本身也用 \ 轉義,因此使用Python的r前綴,就不用考慮轉義的問題了。
例如: s = r ' ABC\-001 '
案例:

match( )方法?判斷是否匹配,如果匹配成功,返回Match對象,否則返回None。

正則切分字符串
用正則表達式切分字符串比用固定的字符更靈活,請看正常的切分代碼
>>> 'a b ?c'.split(' ')
['a', 'b', '', '', 'c']
>>>re.split(r'\s+','a b? c')
['a','b','c']
如果用戶輸入了一組標簽,下次記得用正則表達式來把不規(guī)范的輸入轉化成正確的數(shù)組。
分組
除了簡單地判斷是否匹配之外,正則表達式還有提取子串的強大功能。用 ( ) 表示的就是要提取的分組(Group)

貪婪匹配
正則匹配默認是貪婪匹配,也就是匹配盡可能多的字符。

由于\d+采用貪婪匹配,直接把后面的0全部匹配了,結果0*只能匹配空字符串了。
必須讓\d+采用非貪婪匹配(也就是盡可能少匹配),才能把后面的0匹配出來,加個?就可以讓\d+采用非貪婪匹配:
編譯
當我們在Python中使用正則表達式時,re模塊內(nèi)部會干兩件事情:
1. 編譯正則表達式,如果正則表達式的字符串本身不合法,會報錯;
2. 用編譯后的正則表達式去匹配字符串。
如果一個正則表達式要重復使用幾千次,出于效率的考慮,我們可以預編譯該正則表達式,接下來重復使用時就不需要編譯這個步驟了,直接匹配:

編譯后生成Regular Expression對象,由于該對象自己包含了正則表達式,所以調(diào)用對應的方法時不用給出正則字符串。
筆記摘自:廖雪峰官網(wǎng):www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143193331387014ccd1040c814dee8b2164bb4f064cff000#0