python學(xué)習(xí)筆記之--正式表達(dá)式模塊re

正則表達(dá)式

對(duì)于字符串匹配操作,最強(qiáng)大的工具還是正則表達(dá)式,但是如果不經(jīng)常使用很容易忘記,還是需要多使用,掌握了正則表達(dá)式入門(mén)就可以滿(mǎn)足工作中大部分的使用場(chǎng)景;如果想深入了解,可以參考正則表達(dá)式高級(jí)用法

Python語(yǔ)言中有專(zhuān)門(mén)的模塊可以方便使用正則表達(dá)式來(lái)實(shí)現(xiàn)復(fù)雜的字符串操作,正式本文的主角--re模塊

比較常用的使用方法

  • 先調(diào)用re模塊的compile方法,將正則表達(dá)式字符串編譯成一個(gè)正則表達(dá)式對(duì)象
    re.compile(pattern, flags=0)
    
  • 調(diào)用正則表達(dá)式對(duì)象的方法來(lái)實(shí)現(xiàn)匹配、查找、替換等操作

說(shuō)明:re模塊中定義了與正則表達(dá)式對(duì)象中方法同名的函數(shù),可以實(shí)現(xiàn)同樣的功能。如果需要多次使用這個(gè)正則表達(dá)式的話(huà),使用 re.compile()和保存這個(gè)正則對(duì)象以便復(fù)用,可以讓程序更加高效。

例如:

prog = re.compile(pattern)
result = prog.match(string)

等價(jià)于

result = re.match(pattern, string)

常用的接口總結(jié)

Flag變量

變量名 說(shuō)明
re.Are.ASCII \w, \W, \b, \B, \d, \D, \s\S只匹配ASCII,而不是Unicode。這只對(duì)Unicode樣式有效,會(huì)被byte樣式忽略。相當(dāng)于前面語(yǔ)法中的內(nèi)聯(lián)標(biāo)志 (?a) 。
re.Ire.IGNORCASE 進(jìn)行忽略大小寫(xiě)匹配;相當(dāng)于內(nèi)聯(lián)標(biāo)記 (?i)。
re.Lre.LOCALE 由當(dāng)前語(yǔ)言區(qū)域決定\w, \W, \b, \B 和大小寫(xiě)敏感匹配。這個(gè)標(biāo)記只能對(duì)byte樣式有效。對(duì)應(yīng)內(nèi)聯(lián)標(biāo)記(?L)
re.M、re.MULTILINE 樣式字符 ^ 匹配字符串的開(kāi)始,和每一行的開(kāi)始(換行符后面緊跟的符號(hào));樣式字符 $ 匹配字符串尾,和每一行的結(jié)尾(換行符前面那個(gè)符號(hào))。對(duì)應(yīng)內(nèi)聯(lián)標(biāo)記 (?m)
re.S、re.DOTALL 讓 '.' 特殊字符匹配任何字符,包括換行符;如果沒(méi)有這個(gè)標(biāo)記,'.' 就匹配 除了 換行符的其他任意字符。對(duì)應(yīng)內(nèi)聯(lián)標(biāo)記(?s)
re.S、re.DOTALL 這個(gè)標(biāo)記允許你編寫(xiě)更具可讀性更友好的正則表達(dá)式。通過(guò)分段和添加注釋。空白符號(hào)會(huì)被忽略。對(duì)應(yīng)內(nèi)聯(lián)標(biāo)記 (?x)。
re.DEBUG 顯示編譯時(shí)的debug信息,沒(méi)有內(nèi)聯(lián)標(biāo)記。

接口

函數(shù)名 方法名 說(shuō)明
re.search(pattern, string, flags=0) Pattern.search(string[, pos[, endpos]]) 掃描整個(gè) 字符串 找到匹配樣式的第一個(gè)位置,并返回一個(gè)相應(yīng)的 匹配對(duì)象。找不到就返回一個(gè) None 。
re.match(pattern, string, flags=0) Pattern.match(string[, pos[, endpos]]) 如果 string 開(kāi)始的0或者多個(gè)字符匹配到了正則表達(dá)式樣式,就返回一個(gè)相應(yīng)的 匹配對(duì)象。找不到就返回一個(gè) None 。
re.fullmatch(pattern, string, flags=0) Pattern.fullmatch(string[, pos[, endpos]]) 與上個(gè)相比,要整個(gè) string 匹配才可以。
re.split(pattern, string, maxsplit=0, flags=0) Pattern.split(string, maxsplit=0) 用 pattern 分開(kāi) string 。
re.findall(pattern, string, flags=0) Pattern.findall(string[, pos[, endpos]]) 查找所有匹配項(xiàng),每個(gè)匹配項(xiàng)都不重疊,返回一個(gè)字符串列表;當(dāng)pattern中有捕獲組時(shí)返回元組列表。
re.finditer(pattern, string, flags=0) Pattern.finditer(string[, pos[, endpos]]) 功能同上,返回的是一個(gè)迭代器。
re.sub(pattern, repl, string, count=0, flags=0) Pattern.sub(repl, string, count=0) 返回通過(guò)使用 repl 替換在 string 最左邊非重疊出現(xiàn)的 pattern 而獲得的字符串。 如果樣式?jīng)]有找到,則不加改變地返回 string。 repl 可以是字符串或函數(shù)。
re.subn(pattern, repl, string, count=0, flags=0) Pattern.subn(repl, string, count=0) 同上,但是返回一個(gè)元組 (字符串, 替換次數(shù))。

獨(dú)有特性

  • re模塊函數(shù)

    1. 轉(zhuǎn)義 pattern 中的特殊字符,常用于對(duì)任意可能包含正則表達(dá)式元字符的文本字符串進(jìn)行匹配時(shí)。函數(shù)原型:re.escape(pattern)
    2. re.purge()清除正則表達(dá)式的緩存。
    3. re.error(msg, pattern=None, pos=None)當(dāng)傳遞給函數(shù)的正則表達(dá)式不合法(比如括號(hào)不匹配),或者在編譯或匹配過(guò)程中出現(xiàn)其他錯(cuò)誤時(shí),會(huì)引發(fā)異常。
  • 正則表達(dá)式對(duì)象的方法

    1. Pattern.flags正則匹配標(biāo)記。這是可以傳遞給re.compile的參數(shù)
    2. Pattern.groups捕獲到的模式串中組的數(shù)量。
    3. Pattern.groupindex映射由 (?P<id>)定義的命名符號(hào)組合和數(shù)字組合的字典。如果沒(méi)有符號(hào)組,那字典就是空的。
    4. Pattern.pattern編譯對(duì)象的原始樣式字符串。

search() vs. match()

  • match()檢查字符串開(kāi)頭; search()檢查字符串的任意位置。
  • 在多行模式字符串中,match()也只匹配整個(gè)字符串的開(kāi)始位置,而不會(huì)匹配每一行的開(kāi)始;而search()或者以^開(kāi)始的正則表達(dá)式會(huì)匹配每行的開(kāi)始。

理論上search()是可以替換match()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容