<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          「正則表達(dá)式」的奇幻漂流之旅

          共 2974字,需瀏覽 6分鐘

           ·

          2021-02-27 12:14


          大家好,我是老表,今天分享一篇小帥b寫的正則表達(dá)式相關(guān)文章,內(nèi)容寫的非常易懂,希望這次你看完這篇能夠舒舒服服,一點(diǎn)打人沖動(dòng)沒有,還會(huì)忍不住點(diǎn)贊轉(zhuǎn)發(fā)收藏哈哈哈,主要是希望你還能夠了解到其中的使用方式。

          那么:

          什么是正則表達(dá)式呢?

          想象一下這樣的場景:

          1

          你應(yīng)該經(jīng)常使用 「CTRL + F」在文本文件中搜索關(guān)鍵詞,定位到自己想要看的地方。不過,有時(shí)候你可能并不一定記得你要搜索的具體內(nèi)容。比如你只知道關(guān)鍵詞的開頭是「馬」,結(jié)尾是「梅」,但就是不知道是「馬什么梅」,如何快速搜索替換?

          2

          你在爬取頁面的時(shí)候,得到的一堆 HTML 標(biāo)簽,但是你只是想拿到其中的關(guān)鍵文本信息,怎么快速剔除掉 HTML 標(biāo)簽,把自己想要的文本從里面提取出來呢?

          3

          如果你開發(fā)了一個(gè)網(wǎng)站,允許用戶注冊(cè),但你要求用戶注冊(cè)的密碼需要含有大小寫字母和數(shù)字,怎么驗(yàn)證呢?又,如何屏蔽用戶的違規(guī)言論呢?

          4

          你在使用命令行的時(shí)候,如何一步到位的管理相關(guān)的文件呢?比如 rm -rf * (咋這個(gè)目錄下的文件都被刪除了?)

          ...

          你看,在這些場景中,我們都需要一個(gè)「東西」來「占位」,表達(dá)關(guān)鍵的信息,比如在場景 1 中,我們不知道具體叫 「馬什么梅」,但是知道它中間一定是個(gè)字,那么我們可以制定一個(gè)規(guī)則,說:「以后這玩意【??】就代表一個(gè)任意的中文字」。

          ?? = 任意一個(gè)中文字

          如果你的編輯器遵循了這一規(guī)則,知道【??】就代表一個(gè)任意的中文字,那么我們接下來就可以根據(jù)這個(gè)規(guī)則,使用「馬??梅」進(jìn)行快速匹配了。

          所以其實(shí),這個(gè)「東西」就是用來描述我們想要的規(guī)則的,對(duì)吧?

          當(dāng)然,你也知道,我們自己制定的「東西」,編輯器是不會(huì)聽我們的,如果我們能夠知道那些已經(jīng)被大多數(shù)遵循了的「東西」,不就可以做到快速匹配我們想要的內(nèi)容了嗎?

          這些被遵循的「東西」,就是正則表達(dá)式的元字符。

          找到那些被遵循的「東西」

          先認(rèn)識(shí)「.」 和 「*」

          這兩玩意也許是我們最常用到的「東西」了,其中每個(gè)「.」用來表達(dá)的是「除了換行符以外的任何字符」,像這樣:


          標(biāo)高亮的表示被匹配到的字符

          一個(gè)「.」只能表達(dá)一個(gè)字符,那如果很多豈不是得點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)到天荒地老?所以其實(shí)我們不必要這樣去用那么多點(diǎn)來匹配,我們可以在「.」后面使用 「*」,這樣編輯器就知道:「哦,你要找的是0個(gè)或者多個(gè)『.』」:


          所以,「.」是用來描述相關(guān)字符,而「*」用來描述匹配次數(shù)的。

          和「.」一樣

          雖然這兩玩意已經(jīng)可以代表大多數(shù)內(nèi)容了,但是對(duì)于一些具體的內(nèi)容,比如數(shù)字,換行等,也有已經(jīng)被遵循的「東西」,和「.」一樣,常用到的有:

          把這個(gè)看熟,你基本可以匹配大部分你需要的內(nèi)容了,比如你要在這里只找到「handsome」這個(gè)詞就可以這樣:


          匹配多個(gè)字母,數(shù)字,下劃線:


          只匹配字母:


          反向匹配:


          匹配回車:


          你去玩幾下就都熟悉了。

          和 「*」 一樣

          我們知道 「*」代表的是匹配0次或多次。和 「*」 一樣也有表示次數(shù)的,比如具體多少次,0次或一次:

          轉(zhuǎn)義

          現(xiàn)在,你已經(jīng)知道了常用的「東西」,它們都代表著一定的規(guī)則,但如果有時(shí)候文本出現(xiàn)了和「東西」一樣的字符,怎么去匹配呢?

          比如說,我們知道「.」是匹配除了換行外的所有字符,但如果文本就出現(xiàn)了「.」,我們只要匹配這個(gè)「.」,咋整?


          我們可以使用轉(zhuǎn)義字符,也就是在 「.」前面加一個(gè) 「\」,就說明我們是真的要找的是「.」:



          當(dāng)你在 「東西」前面加一個(gè)「\」,它就失去了功效,變回了原來的模樣。

          還會(huì)常用到這玩意「|」

          這個(gè)你應(yīng)該很熟悉,就是「或」的意思,在 「|」的兩邊,滿足其一即可。

          a|b 匹配 a 或者 b。

          比如判斷文件是不是圖片類型,就可以這樣:

          ^.*?.(gif|png|jpg)$

          小試牛刀

          現(xiàn)在,找到了這些「東西」,也知道了轉(zhuǎn)義....現(xiàn)在我們來寫一個(gè)正則表達(dá)式,匹配郵箱的規(guī)則吧。

          我們知道,郵箱的格式是這樣的:

          [email protected]

          我們可以發(fā)現(xiàn),郵箱有兩很明顯的特征點(diǎn):「@」和「.」,而在「@」和 「.」前面和后面可以是一個(gè)或多個(gè)「大小寫字母或數(shù)字或下劃線」。

          我們可以從開始到結(jié)束的特征點(diǎn)寫出來:

          ^[大小寫字母或數(shù)字或下劃線]+@[大小寫字母或數(shù)字或下劃線]+\.[大小寫字母或數(shù)字或下劃線]+$

          替換成我們知道的「東西」:

          ^[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$

          好用的 ()

          在這些「東西」里,()能夠進(jìn)行分組,這對(duì)于我們?cè)谔崛∑ヅ湮覀冴P(guān)心的內(nèi)容很有幫助,比如我們要提取這樣的內(nèi)容:

          我們可以使用 ()對(duì)相關(guān)的匹配進(jìn)行分組,這樣得到多個(gè)分組(group1、group2、group3...)結(jié)果,這樣可以很方便的從中提取內(nèi)容,像這樣:

          .*? 和 .*

          這兩玩意都是匹配多個(gè)字符的「東西」,不過一個(gè)帶了「?」一個(gè)不帶,它們有什么區(qū)別呢?

          .*? 表示的是非貪婪匹配

          .* 表示的是貪婪匹配

          啥意思呢?

          舉一個(gè)最簡單的例子,比如我們有一個(gè)這樣的文本:

          abcdefghijkabcdefghijkabcdefghijkabcdefghijk

          如果我們想從中提取 a 到 k 的內(nèi)容,你可以發(fā)現(xiàn),當(dāng)我們「貪婪」的時(shí)候得到的結(jié)果就是這樣的:

          abcdefghijkabcdefghijkabcdefghijkabcdefghijk

          「非貪婪」的時(shí)候,得到的結(jié)果就是這樣的:

          abcdefghijk

          那么用在它們兩身上,就是這樣的,貪婪:


          非貪婪:


          意思就是這么個(gè)意思~

          ok,這就是我常常會(huì)使用到的正則表達(dá)式,在 Python 中,有個(gè) re 庫可以專門操作這些玩意的,你可以到下面這個(gè)鏈接看到具體的解釋:

          https://docs.python.org/zh-cn/3/library/re.html

          順便,再給你推薦幾個(gè)正則表達(dá)式可以參考的地方:

          這里,有圖文相關(guān)的正則表達(dá)式給你參考:

          https://github.com/cdoco/common-regex


          這里,可以讓你校驗(yàn)自己寫的正則:

          https://regexr.com/

          這里,有多個(gè)語言版本的正則表達(dá)式教程(如果你想更進(jìn)一步了解反向引用,零寬斷言的可以看看):

          https://github.com/ziishaned/learn-regex/blob/master/README.md


          我在上面演示用到的插件,叫「Regex Matcher」。

          ok,以上就是今天給你帶來的分享,正則表達(dá)式算是基礎(chǔ)且通用的技能了,希望對(duì)你有幫助,如果有的話,請(qǐng)拼命點(diǎn)贊分享一波,哈哈,那么我們下回見,peace!

          掃碼回復(fù):2021

          獲取最新學(xué)習(xí)資源

          【書籍推薦】


          《機(jī)器學(xué)習(xí)入門:基于數(shù)學(xué)原理的Python實(shí)戰(zhàn)》機(jī)器學(xué)習(xí)是一門涉及高等數(shù)學(xué)、線性代數(shù)、概率論、統(tǒng)計(jì)學(xué)和運(yùn)籌學(xué)等領(lǐng)域的交叉學(xué)科。機(jī)器學(xué)習(xí)的基礎(chǔ)就是數(shù)學(xué),這也就要求學(xué)習(xí)者要有良好的數(shù)學(xué)基礎(chǔ)。



          點(diǎn)擊公眾號(hào)卡片關(guān)注,一起學(xué)Python

          學(xué)習(xí)更多:
          整理了我開始分享學(xué)習(xí)筆記到現(xiàn)在超過250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機(jī)器學(xué)習(xí)等方面,別再說不知道該從哪開始,實(shí)戰(zhàn)哪里找了

          看完“點(diǎn)贊”的美德不能丟 

          瀏覽 35
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  夜夜躁狠狠躁日日躁视频 | 豆花视频入口www | 五月天av在线 | www.日韩bbb | 亚洲男人的天堂网 |