1. 正則表達(dá)式 正則表達(dá)式是可以匹配文本片段的模式。 1.1 通配符 正則表達(dá)式能夠匹配對于一個的字符串,,可以使用特殊字符創(chuàng)建這類模式,。(圖片來自cnblogs) 1.2 特殊字符的轉(zhuǎn)義 由于在正則表達(dá)式中,有時需要將特殊字符作為普通字符處理,,就需要用‘\’進(jìn)行轉(zhuǎn)義,,例如‘python\\.org’就會匹配‘python.org’,那么為什么要用兩個反斜杠呢,,原因在于需要進(jìn)行兩層轉(zhuǎn)義,,首先是re模塊表示正則表達(dá)式中需要轉(zhuǎn)義一次,其次是python解釋器即python的語法還要求再轉(zhuǎn)義一次,。也是因為這個原因,,對于‘\’需要‘\\\\’來匹配。為了表示的簡介性,,可以使用原始字符串來處理,,則上面兩例分別可以寫為r‘python\.org’和r‘\\’。 1.3 字符集 舉例說明,,例如‘[pj]python’可以匹配‘python’和‘jpython’,,[a-zA-Z0-9]可以匹配任意一個大小寫字母和數(shù)字(注意:是一個)。為了反轉(zhuǎn)字符集,,可以將‘^’放在字符串的開頭,,例如‘[^abc]’可以匹配除a,b,,c以為的任意字符,。 注意:如果希望‘.’,‘*’,,‘?’這些特殊字符用作文本字符,,則需‘\’進(jìn)行轉(zhuǎn)義,但是在字符集中無必要,,盡管是合法的(因為可以調(diào)整順序來解決),。記住以下兩個規(guī)則: a. 如果‘^’出現(xiàn)在字符集的開頭則需要轉(zhuǎn)義,除非希望用作字符集反轉(zhuǎn),。 b. 右中括號‘]’和橫線‘-’要么放在字符集開頭,,要么轉(zhuǎn)義,。 1.4 選擇符和子模塊 如果只想匹配‘python’和‘perl’,則可以用選擇運算符管道符號‘|’,,模式可寫為‘python|perl’ 如果不需要對整個模式使用選擇運算符,,而只需要一部分,可以用括號括起需要的部分,,對于上例,,表示為‘p(ython|erl)’。括號括起部分稱為子模塊(subpattren),。 1.5 可選項和重復(fù)子模塊 在子模塊后面加上問號,,就變成了可選項。 (pattern),?:允許模式出現(xiàn)0次或者1次,。 (pattern)+:允許模式出現(xiàn)1次或者多次。 (pattern)*:允許模式出現(xiàn)0次或者多次,。 (pattern){m,n}:允許模式出現(xiàn)m~n次,。 1.6 字符串的開始和結(jié)尾 舉例說明,‘www.python.org’和‘python.www.org’中的子字符串‘www’能匹配模式‘w+’,,但是只希望‘www.python.org’能匹配,,則模式可用‘^w+’表示,如果希望‘python.org.www’中的子字符串‘www’能匹配‘w+’,,則模式需寫為‘$w+’,。
2. re模塊的函數(shù) 2.1 .compile 將正則表達(dá)式轉(zhuǎn)換為模式對象,實現(xiàn)更有效率的匹配,。 import re pattern = re.compile('(^w+)\.python\.org') 2.2 .search(重要) 在給定字符串中尋找第一個匹配給定正則表達(dá)式的子字符串,,如果找到會返回一個MatchObject對象,這個對象中的元素可以.group()得到(之后將會介紹group的概念),,如果沒找到就會返回None,。 可以先判斷是否找到再取元素,假設(shè)例子中的pattern有兩個組,,返回第一個組,。 have_character = re.search(pattern,text) if not have_character: return have_character.group(1) 2.3 .match 在給定字符串的開始處匹配正則表達(dá)式,例如re.match(‘p’,‘python’)返回為對象MatchObject,,即匹配成功,,如果要匹配整個字符串,則可以在模式最后加上‘$’符號(代表結(jié)尾也匹配),。 2.4 .split 根據(jù)模式匹配項來分割字符串,。類似于字符串的split方法,,但是可用正則表達(dá)式來帶起固定的分隔符字符串,,例如允許用任意長度的逗號和空格序列來分割字符串,。 text = 'a, b,,,,c d' re.split('[, ]+', text) #['a', 'b', 'c', 'd'] 參數(shù)maxsplit可以設(shè)定最多的分割次數(shù)。 text = 'a, b,,,,c d' re.split('[, ]+', text, maxsplit=2) #['a', 'b', 'c d'] 2.5 .findall(重要) 該方法以列表的形式返回所有的匹配項,。 pattern = 'a(b+?)c(d+?)e' items = re.findall(pattern, 'abbcddeabbbcddde') print items #items = [('bb', ‘dd’), ('bbb', 'ddd')] 2.6 .sub(pattern, repl, string[, count=0]) (重要) 將字符串中所有pattern的匹配項用repl代替,。 pattern = re.compile(r'\*([^\*]+)\*') re.sub(pattern, r'<em>\1</em>', 'Hello, *world*!') #'Hello, <em>world</em>!' 在sub函數(shù)三個參數(shù)中,pattern代表模式,,repl代表目標(biāo)形式,,string代表待匹配替換字符串。 替換步驟: a. 用模式pattern套待匹配替換字符串string,。 b. 按照目標(biāo)形式repl對字符串進(jìn)行重建(即用目標(biāo)形式去代替string中與pattern匹配的子字符串) sub函數(shù)強大功能最重要的體現(xiàn)在于可以在替代字符串中使用組號,。(具體內(nèi)容參考鏈接:http:///questions/5984633/python-re-sub-group-number-after-number, http://www./python_re_sub_detailed_introduction/) re.sub(r'(foo)', r'\g<1>123', 'foobar') #'foo123bar' 2.7 .escape 如果一個字符串很長且包含很多特殊字符,,而不想輸入一大堆反斜杠來轉(zhuǎn)義,,可以用這個函數(shù)對字符串中所有可能被解釋為正則運算符的字符進(jìn)行轉(zhuǎn)義為普通文本字符。
3. 匹配對象和組 re模塊的search,,match函數(shù)在找到匹配項時都會返回一個MatchObject對象,,對于這樣一個對象m,可以用m.group()來取某組的信息,,如果.group()默認(rèn)組號為0,,則返回整個字符串,.group(1)返回與第一個子模式匹配的單個字符串,,.group(2)等等以此類推,。 .start()方法得到對應(yīng)組的開始索引,.end()得到對應(yīng)組的結(jié)束索引,,.span()以元組形式給出對應(yīng)組的開始和結(jié)束位置,,括號中填入組號,不填入組號時默認(rèn)為0,。
4. 貪婪和非貪婪模式 重復(fù)運算符在默認(rèn)條件下是貪婪的,。 pattern = r'\*(.+)\*' re.sub(pattern, r'<em>\1</em>', '*This* is *it*!') #'<em>This* is *it</em>' 可見貪婪模式匹配了開始星號到結(jié)束星號間的全部內(nèi)容,包括中間兩個星號,。 用(.+?)代替(.+)得到非貪婪模式,,它會匹配盡可能少的內(nèi)容。 pattern = r'\*(.+?)\*' re.sub(pattern, r'<em>\1</em>', '*This* is *it*!') #'<em>This</em> is <em>it</em>'
|
|