正則表達(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.A、re.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.I、re.IGNORCASE
|
進(jìn)行忽略大小寫(xiě)匹配;相當(dāng)于內(nèi)聯(lián)標(biāo)記 (?i)。 |
re.L、re.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ù)- 轉(zhuǎn)義 pattern 中的特殊字符,常用于對(duì)任意可能包含正則表達(dá)式元字符的文本字符串進(jìn)行匹配時(shí)。函數(shù)原型:
re.escape(pattern) -
re.purge()清除正則表達(dá)式的緩存。 -
re.error(msg, pattern=None, pos=None)當(dāng)傳遞給函數(shù)的正則表達(dá)式不合法(比如括號(hào)不匹配),或者在編譯或匹配過(guò)程中出現(xiàn)其他錯(cuò)誤時(shí),會(huì)引發(fā)異常。
- 轉(zhuǎn)義 pattern 中的特殊字符,常用于對(duì)任意可能包含正則表達(dá)式元字符的文本字符串進(jìn)行匹配時(shí)。函數(shù)原型:
-
正則表達(dá)式對(duì)象的方法-
Pattern.flags正則匹配標(biāo)記。這是可以傳遞給re.compile的參數(shù) -
Pattern.groups捕獲到的模式串中組的數(shù)量。 -
Pattern.groupindex映射由(?P<id>)定義的命名符號(hào)組合和數(shù)字組合的字典。如果沒(méi)有符號(hào)組,那字典就是空的。 -
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()