乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Python正則表達(dá)式,這一篇就夠了

       copy_left 2021-01-11

      大多數(shù)編程語(yǔ)言的正則表達(dá)式設(shè)計(jì)都師從Perl,所以語(yǔ)法基本相似,不同的是每種語(yǔ)言都有自己的函數(shù)去支持正則,今天我們就來(lái)學(xué)習(xí) Python中關(guān)于 正則表達(dá)式的函數(shù)。

      Python正則表達(dá)式,這一篇就夠了

      re模塊主要定義了9個(gè)常量、12個(gè)函數(shù)、1個(gè)異常,每個(gè)常量和函數(shù)豬哥 都會(huì)通過(guò)實(shí)際代碼案例講解,讓大家能更直觀了解其作用!

      注:為避免出現(xiàn)代碼格式錯(cuò)亂,豬哥盡量使用代碼截圖演示哦。

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

      聊到Python正則表達(dá)式的支持,首先肯定會(huì)想到 re 庫(kù),這是一個(gè)Python處理文本的 標(biāo)準(zhǔn)庫(kù)。

      標(biāo)準(zhǔn)庫(kù) 的意思表示這是一個(gè) Python內(nèi)置模塊 ,不需要額外下載,目前Python內(nèi)置模塊大概有300個(gè)??梢栽谶@里查看Python所有的內(nèi)置模塊:https://docs./3/py-modindex.html#cap-r

      因?yàn)閞e是內(nèi)置模塊,所以不需要再下載,使用時(shí)直接引入即可:

      import re

      re模塊官方文檔:https://docs./zh-cn/3.8/library/re.html

      re模塊庫(kù)源碼:https://github.com/python/cpython/blob/3.8/Lib/re.py

      二、re模塊常量

      常量即表示不可更改的變量,一般用于做標(biāo)記。

      re模塊中有9個(gè)常量,常量的值都是int類型!

      Python正則表達(dá)式,這一篇就夠了

      上圖我們可以看到,所有的常量都是在 RegexFlag枚舉類 來(lái)實(shí)現(xiàn),這是在Python 3.6做的改版。在Python 3.6以前版本是直接將常量寫在re.py中,使用枚舉的好處就是方便管理和使用!

      Python正則表達(dá)式,這一篇就夠了

      下面我們來(lái)快速學(xué)習(xí)這些常量的作用及如何使用他們,按常用度排序!

      1. IGNORECASE

      語(yǔ)法: re.IGNORECASE 或簡(jiǎn)寫為 re.I

      作用: 進(jìn)行忽略大小寫匹配。

      代碼案例:

      Python正則表達(dá)式,這一篇就夠了

      在默認(rèn)匹配模式下 大寫字母B 無(wú)法匹配 小寫字母b ,而在 忽略大小寫 模式下是可以的。

      2. ASCII

      語(yǔ)法: re.ASCII 或簡(jiǎn)寫為 re.A

      作用: 顧名思義,ASCII表示ASCII碼的意思,讓 \w , \W , \b , \B , \d , \D , \s\S只匹配ASCII,而不是Unicode。

      代碼案例:

      Python正則表達(dá)式,這一篇就夠了

      在默認(rèn)匹配模式下 \w+ 匹配到了所有字符串,而在 ASCII 模式下,只匹配到了a、b、c(ASCII編碼支持的字符)。

      注意:這只對(duì)字符串匹配模式有效,對(duì)字節(jié)匹配模式無(wú)效。

      3. DOTALL

      語(yǔ)法: re.DOTALL 或簡(jiǎn)寫為 re.S

      作用: DOT表示 . ,ALL表示所有,連起來(lái)就是 . 匹配所有,包括換行符 \n默認(rèn)模式下 . 是不能匹配行符 \n。

      代碼案例:

      Python正則表達(dá)式,這一篇就夠了

      在默認(rèn)匹配模式下 . 并沒(méi)有匹配換行符 \n ,而是將字符串分開匹配;而在 re.DOTALL 模式下,換行符 \n 與字符串一起被匹配到。

      注意: 默認(rèn)匹配模式下 . 并不會(huì)匹配換行符 \n

      4. MULTILINE

      語(yǔ)法: re.MULTILINE 或簡(jiǎn)寫為 re.M

      作用: 多行模式,當(dāng)某字符串中有換行符 \n ,默認(rèn)模式下是不支持換行符特性的,比如:行開頭 和 行結(jié)尾,而多行模式下是支持匹配行開頭的。

      代碼案例:

      Python正則表達(dá)式,這一篇就夠了

      正則表達(dá)式中 ^ 表示匹配行的開頭,默認(rèn)模式下它只能匹配字符串的開頭;而在多行模式下,它還可以匹配 換行符 \n 后面的字符。

      注意:正則語(yǔ)法中 ^ 匹配行開頭、 \A 匹配字符串開頭,單行模式下它兩效果一致,多行模式下 \A 不能識(shí)別 \n 。

      5. VERBOSE

      語(yǔ)法: re.VERBOSE 或簡(jiǎn)寫為 re.X

      作用: 詳細(xì)模式,可以在正則表達(dá)式中加注解!

      代碼案例:

      Python正則表達(dá)式,這一篇就夠了

      默認(rèn)模式下并不能識(shí)別正則表達(dá)式中的注釋,而詳細(xì)模式是可以識(shí)別的。

      當(dāng)一個(gè)正則表達(dá)式十分復(fù)雜的時(shí)候,詳細(xì)模式或許能為你提供另一種注釋方式,但它不應(yīng)該成為炫技的手段,建議謹(jǐn)慎考慮后使用!

      6.LOCALE

      語(yǔ)法: re.LOCALE 或簡(jiǎn)寫為 re.L

      作用: 由當(dāng)前語(yǔ)言區(qū)域決定 \w , \W , \b , \B 和大小寫敏感匹配,這個(gè)標(biāo)記只能對(duì)byte樣式有效。 這個(gè)標(biāo)記官方已經(jīng)不推薦使用 ,因?yàn)檎Z(yǔ)言區(qū)域機(jī)制很不可靠,它一次只能處理一個(gè) “習(xí)慣”,而且只對(duì)8位字節(jié)有效。

      注意: 由于這個(gè)標(biāo)記官方已經(jīng)不推薦使用,而且豬哥也沒(méi)使用過(guò),所以就不給出實(shí)際的案例!

      7.UNICODE

      語(yǔ)法: re.UNICODE 或簡(jiǎn)寫為 re.U

      作用: 與 ASCII 模式類似,匹配unicode編碼支持的字符,但是 Python 3 默認(rèn)字符串已經(jīng)是Unicode,所以有點(diǎn)冗余。

      8. DEBUG

      語(yǔ)法: re.DEBUG

      作用: 顯示編譯時(shí)的debug信息。

      代碼案例:

      Python正則表達(dá)式,這一篇就夠了

      雖然debug模式下確實(shí)會(huì)打印編譯信息,但豬哥并不理解這是什么語(yǔ)言 以及表達(dá)的含義, 希望了解的朋友能不吝賜教。

      9.TEMPLATE

      語(yǔ)法: re.TEMPLATE 或簡(jiǎn)寫為 re.T

      作用: 豬哥也沒(méi)搞懂TEMPLATE的具體用處,源碼注釋中寫著: disable backtracking(禁用回溯),有了解的同學(xué)可以留言告知!

      Python正則表達(dá)式,這一篇就夠了

      10. 常量總結(jié)

      1. 9個(gè)常量中,前5個(gè)(IGNORECASE、ASCII、DOTALL、MULTILINE、VERBOSE)有用處,兩個(gè)(LOCALE、UNICODE)官方不建議使用、兩個(gè)(TEMPLATE、DEBUG)試驗(yàn)性功能,不能依賴。
      2. 常量在re常用函數(shù)中都可以使用,查看源碼可得知。
      3. 常量可疊加使用,因?yàn)槌A恐刀际?的冪次方值,所以是可以疊加使用的,疊加時(shí)請(qǐng)使用 | 符號(hào),請(qǐng)勿使用 + 符號(hào)!

      最后來(lái)一張思維導(dǎo)圖總結(jié)一下re模塊中的常量吧, 需要高清圖或者xmind文件的同學(xué)可在文章末尾

      獲取。

      Python正則表達(dá)式,這一篇就夠了

      三、re模塊函數(shù)

      re模塊有12個(gè)函數(shù),豬哥將以功能分類來(lái)講解;這樣更具有比較性,同時(shí)也方便記憶。

      1.查找一個(gè)匹配項(xiàng)

      查找并返回一個(gè)匹配項(xiàng)的函數(shù)有3個(gè): search、match、fullmatch ,他們的區(qū)別分別是:

      1. search 查找任意位置的匹配項(xiàng)
      2. match 必須從字符串開頭匹配
      3. fullmatch 整個(gè)字符串與正則完全匹配

      我們?cè)賮?lái)根據(jù)實(shí)際的代碼案例比較:

      案例1:

      Python正則表達(dá)式,這一篇就夠了

      案例1中 search函數(shù) 是在字符串中任意位置匹配,只要有符合正則表達(dá)式的字符串就匹配成功,其實(shí)有兩個(gè)匹配項(xiàng),但search函數(shù)值返回一個(gè)。

      match函數(shù) 是要從頭開始匹配,而字符串開頭多了個(gè)字母 a ,所以無(wú)法匹配, fullmatch函數(shù) 需要完全相同,故也不匹配!

      案例2:

      Python正則表達(dá)式,這一篇就夠了

      案例2刪除了text最開頭的字母a,這樣 match函數(shù) 就可以匹配啦,而 fullmatch函數(shù) 依然不能完全匹配!

      案例3:

      Python正則表達(dá)式,這一篇就夠了

      案例3中,我們只留下一段文字,并且與正則表達(dá)式一致;這時(shí) fullmatch函數(shù) 終于可以匹配了。

      完整案例:

      Python正則表達(dá)式,這一篇就夠了

      注意:查找 一個(gè)匹配項(xiàng) 返回的都是一個(gè)匹配對(duì)象(Match)。

      2.查找多個(gè)匹配項(xiàng)

      講完查找一項(xiàng),現(xiàn)在來(lái)看看查找多項(xiàng)吧,查找多項(xiàng)函數(shù)主要有: findall函數(shù)finditer函數(shù)

      1. findall 從字符串任意位置查找, 返回一個(gè)列表
      2. finditer :從字符串任意位置查找, 返回一個(gè)迭代器

      兩個(gè)方法基本類似,只不過(guò)一個(gè)是返回列表,一個(gè)是返回迭代器。我們知道列表是一次性生成在內(nèi)存中,而迭代器是需要使用時(shí)一點(diǎn)一點(diǎn)生成出來(lái)的,內(nèi)存使用更優(yōu)。

      Python正則表達(dá)式,這一篇就夠了

      如果可能存在大量的匹配項(xiàng)的話,建議使用 finditer函數(shù) ,一般情況使用 findall函數(shù) 基本沒(méi)啥影響。

      3.分割

      re.split(pattern, string, maxsplit=0, flags=0) 函數(shù):用 pattern 分開 string , maxsplit 表示最多進(jìn)行分割次數(shù), flags 表示模式,就是上面我們講解的常量!

      Python正則表達(dá)式,這一篇就夠了

      注意: str 模塊也有一個(gè) split函數(shù) ,那這兩個(gè)函數(shù)該怎么選呢?

      str.split函數(shù)功能簡(jiǎn)單,不支持正則分割,而re.split支持正則。

      關(guān)于二者的速度如何? 豬哥實(shí)際測(cè)試了一下,在相同數(shù)據(jù)量的情況下使用 re.split 函數(shù)與 str.split

      函數(shù) 執(zhí)行次數(shù)執(zhí)行時(shí)間 對(duì)比圖:

      Python正則表達(dá)式,這一篇就夠了

      通過(guò)上圖對(duì)比發(fā)現(xiàn),1000次循環(huán)以內(nèi) str.split 函數(shù)更快,而循環(huán)次數(shù)1000次以上后 re.split 函數(shù)明顯更快,而且次數(shù)越多差距越大!

      所以結(jié)論是: 在 不需要正則支持 且 數(shù)據(jù)量和數(shù)次不多 的情況下使用 str.split 函數(shù)更合適,反之則使用 re.split 函數(shù) 。

      注:具體執(zhí)行時(shí)間與測(cè)試數(shù)據(jù)有關(guān)!

      4.替換

      替換主要有 sub函數(shù)subn函數(shù) ,他們功能類似!

      先來(lái)看看 sub函數(shù) 的用法:

      re.sub (pattern, repl, string, count=0, flags=0) 函數(shù)參數(shù)講解:repl替換掉string中被pattern匹配的字符, count表示最大替換次數(shù),flags表示正則表達(dá)式的常量。

      值得注意的是: sub函數(shù) 中的入?yún)ⅲ?repl替換內(nèi)容既可以是字符串,也可以是一個(gè)函數(shù)哦! 如果repl為函數(shù)時(shí),只能有一個(gè)入?yún)?/span>:Match匹配對(duì)象。

      Python正則表達(dá)式,這一篇就夠了

      re.subn

      (pattern, repl, string, count=0, flags=0)函數(shù)與 re.sub函數(shù) 功能一致,只不過(guò)返回一個(gè)元組 (字符串, 替換次數(shù))。

      Python正則表達(dá)式,這一篇就夠了

      5.編譯正則對(duì)象

      compile函數(shù)

      template函數(shù) 將正則表達(dá)式的樣式編譯為一個(gè) 正則表達(dá)式對(duì)象 (正則對(duì)象Pattern),這個(gè)對(duì)象與re模塊有同樣的正則函數(shù)(后面我們會(huì)講解Pattern正則對(duì)象)。

      Python正則表達(dá)式,這一篇就夠了

      template函數(shù)compile函數(shù) 類似,只不過(guò)是增加了我們之前說(shuō)的 re.TEMPLATE 模式,我們可以看看源碼。

      Python正則表達(dá)式,這一篇就夠了

      6.其他

      re.escape(pattern) 可以轉(zhuǎn)義正則表達(dá)式中具有特殊含義的字符,比如: . 或者 *

      ,舉個(gè)實(shí)際的案例:

      Python正則表達(dá)式,這一篇就夠了

      re.escape(pattern) 看似非常好用省去了我們自己加轉(zhuǎn)義,但是使用它很容易出現(xiàn)轉(zhuǎn)義錯(cuò)誤的問(wèn)題,所以并不建議使用它轉(zhuǎn)義, 而建議大家自己手動(dòng)轉(zhuǎn)義 !

      re.purge() 函數(shù)作用就是清除 正則表達(dá)式緩存

      ,具體有什么緩存呢?我們來(lái)看看源碼就知道它背地里干了 什么:

      Python正則表達(dá)式,這一篇就夠了

      看方法大概是清除緩存吧,我們?cè)賮?lái)看看具體的案例:

      Python正則表達(dá)式,這一篇就夠了

      完整教學(xué)視頻代碼獲取后臺(tái)私信小編01即可

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多