為了使文章更具可讀性,本文將正則表達(dá)式冗長(zhǎng)的 語(yǔ)法介紹 放在了文章的末尾。
正則表達(dá)式(RegExp)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(元字符)。
正則表達(dá)式運(yùn)算符的優(yōu)先級(jí)順序由高到低依次為:
/(),(?:),(?=), []*,+,?,{n},{n,},{n,m}^,$,/元字符,字符|字符具有高于替換運(yùn)算符的優(yōu)先級(jí),使得 m|food 匹配 m 或 food。若要匹配 mood 或 food,請(qǐng)使用括號(hào)創(chuàng)建子表達(dá)式,即 (m|f)ood。
匹配漢字:
[/u4e00-/u9fa5]
re 模塊提供了 Perl 風(fēng)格的正則表達(dá)式模式。Perl 5 對(duì)標(biāo)準(zhǔn)正則表達(dá)式增加了幾個(gè)附加功能,re 模塊也支持其中的大部分。
正則表達(dá)式使用反斜杠 / 來(lái)代表特殊形式或用作轉(zhuǎn)義字符,這里跟 Python 的語(yǔ)法沖突,因此,Python 只好用 //// 匹配 /,因?yàn)檎齽t表達(dá)式中如果要匹配 /,需要用 / 來(lái)轉(zhuǎn)義,變成 //,而 Python 語(yǔ)法中又需要對(duì)字符串中每一個(gè) / 進(jìn)行轉(zhuǎn)義,所以就變成了 ////。
為了使正則表達(dá)式具有更好的可讀性,Python 特別設(shè)計(jì)了 Raw String。Raw String 以 r 作為字符串的前綴,如 r"/n" 表示字符 / 和 n。
compile(RegExp [, flags]) 可以把正則表達(dá)式編譯成一個(gè)正則表達(dá)式對(duì)象。其中,RegExp 為正則表達(dá)式,flags 為編譯標(biāo)志。
import rehtml = re.compile(r"</s*(/S+)(/s[^>]*)?>[/s/S]*</s*//1/s*>") # 匹配 HTML 標(biāo)記(1)編譯標(biāo)志控制表達(dá)式的匹配方式。多個(gè)標(biāo)志可以通過(guò) | 來(lái)指定,如 re.I | re.M 被設(shè)置成 I 和 M 標(biāo)志。
| 標(biāo)志 | 含義 |
|---|---|
| S 或 DOTALL | 使 . 匹配包括換行在內(nèi)的所有字符 |
| I 或 IGNORECASE | 使匹配對(duì)大小寫(xiě)不敏感 |
| L 或 LOCALE | 做本地化識(shí)別匹配 |
| M 或 MULTILINE | 多行匹配,影響 ^ 和 $ |
| X 或 VERBOSE | 提高正則表達(dá)式的可讀性 |
X 標(biāo)志的作用:
dog | cat 和可讀性差的 dog|cat 相同,但 [a b] 將匹配字符 a、b 或空格。# 開(kāi)始到行末結(jié)束。Xhtml = re.compile(r'''# 匹配 HTML 標(biāo)記(2)</s*(/S+)(/s[^>]*)?> # 開(kāi)始標(biāo)簽[/s/S]* # 標(biāo)簽內(nèi)的文本</s*//1/s*> # 同名結(jié)束標(biāo)簽 ''', re.X) # 同樣匹配 HTML 標(biāo)記,方法(2)的可讀性比(1)高了很多。| 方法 | 用途 |
|---|---|
match(RegExp, string [, flags]) | 從字符串的開(kāi)始匹配一個(gè)模式,成功則返回 MatchObject 實(shí)例,否則返回 None |
search(RegExp, string [, flags]) | 在整個(gè)字符串內(nèi)查找模式匹配,成功則返回 MatchObject 實(shí)例,否則返回 None |
findall(RegExp, string [, flags]) | 獲取所有匹配的子串,并把它們作為一個(gè)列表返回 |
finditer(RegExp, string [, flags]) | 獲取所有匹配的子串,并把它們作為一個(gè)迭代器返回 |
若已將正則表達(dá)式 RegExp 編譯成了正則表達(dá)式對(duì)象 RegPat,還可以使用 RegPat.match(string) 執(zhí)行匹配。
string = '''Hello World!<ul class="nav"> <li class="inactive"> 云 </li> <li class="inactive"> 大數(shù)據(jù) </li></ul>'''match_1 = re.match("/s/S*",string)match_2 = re.match("/S*",string)search_1 = re.search("/s/S*",string)search_2 = Xhtml.search(string)PRint(match_1, "/n", match_2, end = "/n-------------/n ")print(search_1, "/n", search_2)None <_sre.SRE_Match object; span=(0, 5), match='Hello'>------------- <_sre.SRE_Match object; span=(5, 12), match=' World!'> <_sre.SRE_Match object; span=(13, 99), match='<ul class="nav">/n/t<li class="inactive"> 云 </li>>| 方法 | 用途 |
|---|---|
group() | 返回匹配的字符串 |
start() | 返回匹配開(kāi)始的位置 |
end() | 返回匹配結(jié)束的位置 |
span() | 返回一個(gè)二元元組: (開(kāi)始位置,結(jié)束位置) |
print(search_2.group())<ul class="nav"> <li class="inactive"> 云 </li> <li class="inactive"> 大數(shù)據(jù) </li></ul>| 方法 | 用途 |
|---|---|
split(RegExp, string [, maxsplit = 0]) | 將字符串在匹配的位置分片,并生成一個(gè)列表;若 maxsplit 非零,則只能得到 maxsplit 個(gè)分片 |
sub(RegExp, replace, string[, count = 0]) | 找到所有匹配的子串,并用其它的字符串替換;若 count 非零,則最多執(zhí)行 count 次替換 |
subn(RegExp, replace, string) | 與 sub 類(lèi)似,但返回二元元組:(新的字符串,執(zhí)行替換的次數(shù)) |
print(re.split("/n",string)) # 用回車(chē)符分片print(re.sub("/t", lambda m: '[' + m.group() + ']', string)) # 將制表符用 [ ] 括起來(lái)['Hello World!', '<ul class="nav">', '/t<li class="inactive"> 云 </li>', '/t<li class="inactive"> 大數(shù)據(jù) </li>', '</ul>', '']Hello World!<ul class="nav">[ ]<li class="inactive"> 云 </li>[ ]<li class="inactive"> 大數(shù)據(jù) </li></ul>/:將下一字符標(biāo)記為特殊字符、文本、反向引用或八進(jìn)制轉(zhuǎn)義符。例如, n 匹配字符 n, /n 匹配 /n。序列 // 匹配 / , /( 匹配 ( 。
^:匹配輸入字符串開(kāi)始的位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,^ 還會(huì)與 /n 或 /r 之后的位置匹配。
$:匹配輸入字符串結(jié)尾的位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,$ 還會(huì)與 /n 或 /r 之前的位置匹配。
*:零次或多次匹配前面的字符或子表達(dá)式。例如,zo* 匹配 z 和 zoo 。* 等效于 {0,}。
+:一次或多次匹配前面的字符或子表達(dá)式。例如, zo+ 與 zo 和 zoo 匹配,但與 z 不匹配。+ 等效于 {1,}。
?:零次或一次匹配前面的字符或子表達(dá)式。例如, do(es)? 匹配 do 或 does 中的 do 。? 等效于 {0,1}。
當(dāng)
?緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后時(shí),匹配模式是非貪心的。非貪心的模式匹配搜索到的,盡可能短的字符串,而默認(rèn)的貪心模式匹配搜索到的,盡可能長(zhǎng)的字符串。例如,在字符串 oooo 中,o+?只匹配單個(gè) o,而o+匹配所有 o。
.:匹配除 /n 之外的任何單個(gè)字符。若要匹配包括 /n 在內(nèi)的任意字符,請(qǐng)使用諸如 [/s/S] 之類(lèi)的模式。
x|y:匹配 x 或 y。例如,z|food 匹配 z 或 food 。(z|f)ood 匹配 zood 或 food 。
{n}:n 是非負(fù)整數(shù)。正好匹配 n 次。例如, o{2} 與 Bob 中的 o 不匹配,但與 food 中的兩個(gè) o 匹配。
{n,}:n 是非負(fù)整數(shù)。至少匹配 n 次。例如, o{2,} 不匹配 Bob 中的 o ,而匹配 food 中的所有 o。 o{1,}、o{0,} 分別等效于 o+、o* 。
{n,m}:M 和 n 是非負(fù)整數(shù),其中 n <= m。匹配至少 n 次,至多 m 次。例如, o{1,3} 匹配 fooooood 中的頭三個(gè) o。o{0,1} 等效于 o?。
[xyz]:字符集。匹配包含的任一字符。例如, [abc] 匹配 plain 中的 a 。
[^xyz]:反向字符集。匹配未包含的任何字符。例如, [^abc] 匹配 plain 中的 p 。
[a-z]:字符范圍。匹配指定范圍內(nèi)的任何字符。例如, [a-z] 匹配 a 到 z 范圍內(nèi)的任何小寫(xiě)字母。
[^a-z]:反向范圍字符。匹配不在指定的范圍內(nèi)的任何字符。例如, [^a-z] 匹配任何不在 a 到 z 范圍內(nèi)的任何字符。
(pattern):匹配 pattern 并捕獲該匹配的子表達(dá)式。可以使用 /num 對(duì)捕獲子表達(dá)式進(jìn)行反向引用。括號(hào) ( ) 使用 /( 或者 /) 匹配 。
(?:pattern):匹配 pattern 但不捕獲該匹配的子表達(dá)式,即它是一個(gè)非捕獲匹配,不存儲(chǔ)供以后使用的匹配。這對(duì)于用 | 組合模式部件的情況很有用。例如,industr(?:y|ies) 是比 industry|industries 更經(jīng)濟(jì)的表達(dá)式。
(?=pattern):執(zhí)行正向預(yù)測(cè)先行搜索的子表達(dá)式,該表達(dá)式匹配處于匹配 pattern 起始點(diǎn)的字符串。它是一個(gè)非捕獲匹配,即不能捕獲供以后使用的匹配。例如,Windows (?=95|98|NT|2000) 匹配 Windows 2000 中的 Windows ,但不匹配 Windows 3.1 中的 Windows 。
預(yù)測(cè)先行不占用字符,即發(fā)生匹配后,下一匹配的搜索緊隨上一匹配之后,而不是在組成預(yù)測(cè)先行的字符后。
(?!pattern):執(zhí)行反向預(yù)測(cè)先行搜索的子表達(dá)式,該表達(dá)式匹配不處于匹配 pattern 的字符串的起始點(diǎn)的搜索字符串。它是一個(gè)非捕獲匹配,即不能捕獲供以后使用的匹配。例如,Windows (?!95|98|NT|2000) 匹配 Windows 3.1 中的 Windows ,但不匹配 Windows 2000 中的 Windows 。
/b:匹配一個(gè)字邊界,即字與空格間的位置。例如, er/b 匹配 never 中的 er ,但不匹配 verb 中的 er 。
/B:非字邊界匹配。 er/B 匹配 verb 中的 er ,但不匹配 never 中的 er 。
/cx:匹配 x 指示的控制字符。例如,/cM 匹配 Control-M 或回車(chē)符。x 的值必須在 A-Z 或 a-z 之間。否則假定 /c 就是 c 字符本身。
/d:數(shù)字字符匹配。等效于 [0-9]。
/D:非數(shù)字字符匹配。等效于 [^0-9]。
/f:換頁(yè)符匹配。等效于 /x0c 和 /cL。
/n:換行符匹配。等效于 /x0a 和 /cJ。
/r:匹配一個(gè)回車(chē)符。等效于 /x0d 和 /cM。
/s:匹配任何空白字符,包括空格、制表符、換頁(yè)符等。與 [ /f/n/r/t/v] 等效。
/S:匹配任何非空白字符。與 [^ /f/n/r/t/v] 等效。
/t:制表符匹配。與 /x09 和 /cI 等效。
/v:垂直制表符匹配。與 /x0b 和 /cK 等效。
/w:匹配任何字類(lèi)字符,包括下劃線。與 [A-Za-z0-9_] 等效。
/W:與任何非單詞字符匹配。與 [^A-Za-z0-9_] 等效。
/xn:匹配一個(gè)十六進(jìn)制轉(zhuǎn)義碼。十六進(jìn)制轉(zhuǎn)義碼必須是兩位數(shù)長(zhǎng)。例如, /x41 匹配 A 。允許在正則表達(dá)式中使用 ASCII 代碼。
/num:匹配第 num 個(gè)捕獲子表達(dá)式的反向引用。例如, (.)/1 匹配兩個(gè)連續(xù)的相同字符。
/n:如果 /n 前面至少有 n 個(gè)捕獲子表達(dá)式,那么是反向引用。如果 n 是八進(jìn)制數(shù) 0-7,那么是八進(jìn)制轉(zhuǎn)義碼。
/nm:如果 /nm 前面至少有 nm 個(gè)捕獲子表達(dá)式,那么是反向引用。如果 /nm 前面至少有 n 個(gè)捕獲,則是反向引用,后面跟有字符 m。如果兩種前面的情況都不存在,則 /nm 匹配八進(jìn)制值 nm,其中 n 和 m 是八進(jìn)制數(shù) 0-7。
/nml:當(dāng) n 是八進(jìn)制數(shù) 0-3,m 和 l 是八進(jìn)制數(shù) 0-7 時(shí),匹配八進(jìn)制轉(zhuǎn)義碼 nml。
/un:匹配以四位十六進(jìn)制數(shù)表示的 Unicode 字符。例如,/u00A9 匹配版權(quán)符號(hào) ?。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注