国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

正則表達(dá)式:Python模塊re簡(jiǎn)介

2019-11-14 17:23:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

為了使文章更具可讀性,本文將正則表達(dá)式冗長(zhǎng)的 語(yǔ)法介紹 放在了文章的末尾。

一、正則表達(dá)式簡(jiǎn)介

正則表達(dá)式(RegExp)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(元字符)。

1、運(yùn)算符的優(yōu)先級(jí)

正則表達(dá)式運(yùn)算符的優(yōu)先級(jí)順序由高到低依次為:

  • 轉(zhuǎn)義符:/
  • 括號(hào)和中括號(hào):()(?:)(?=)[]
  • 限定符:*+?{n}{n,}{n,m}
  • 定位點(diǎn)和序列:^$/元字符字符
  • 替換:|

字符具有高于替換運(yùn)算符的優(yōu)先級(jí),使得 m|food 匹配 m 或 food。若要匹配 mood 或 food,請(qǐng)使用括號(hào)創(chuàng)建子表達(dá)式,即 (m|f)ood

2、常用驗(yàn)證規(guī)則

匹配漢字[/u4e00-/u9fa5]

二、re 模塊簡(jiǎn)介

re 模塊提供了 Perl 風(fēng)格的正則表達(dá)式模式。Perl 5 對(duì)標(biāo)準(zhǔn)正則表達(dá)式增加了幾個(gè)附加功能,re 模塊也支持其中的大部分。

1、Raw String

正則表達(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。

  • 并非所有的正則表達(dá)式都需要使用 Raw String,但 compile 方法必須以 r 作為字符串的前綴;
  • 對(duì)于其他方法(如 match、search 等 )而言,是否以 r 作為字符串的前綴并不影響結(jié)果。

2、正則表達(dá)式對(duì)象

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)

3、編譯標(biāo)志

編譯標(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 或空格。
  • 可以把注釋放到正則表達(dá)式當(dāng)中。注釋從 # 開(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)高了很多。

4、執(zhí)行匹配

方法用途
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>>

5、MatchObject 實(shí)例

方法用途
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>

6、操作字符串

方法用途
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>

三、正則表達(dá)式的基本語(yǔ)法

/:將下一字符標(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,其中 nm 是八進(jìn)制數(shù) 0-7。

/nml:當(dāng) n 是八進(jìn)制數(shù) 0-3,ml 是八進(jìn)制數(shù) 0-7 時(shí),匹配八進(jìn)制轉(zhuǎn)義碼 nml。

/un:匹配以四位十六進(jìn)制數(shù)表示的 Unicode 字符。例如,/u00A9 匹配版權(quán)符號(hào) ?。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 永平县| 阳泉市| 洛川县| 崇阳县| 靖江市| 松阳县| 二连浩特市| 泗阳县| 清远市| 古交市| 吴堡县| 无极县| 绍兴县| 焦作市| 龙泉市| 博爱县| 阳曲县| 万州区| 仁寿县| 海宁市| 琼海市| 新昌县| 崇州市| 青浦区| 凤庆县| 太仆寺旗| 响水县| 信宜市| 且末县| 定边县| 丹寨县| 花莲市| 石楼县| 凤翔县| 罗山县| 巴马| 锡林浩特市| 布尔津县| 绥滨县| 绥滨县| 霍林郭勒市|