Python「正則表達式」詳解(上)

2021-01-11 程序猿的百寶箱

大家好,今天我們一起學習以下Python中的「正則表達式」,說到正則表達式,大家可能比較陌生,不過我卻要告訴你,你每天都在使用正則表達式,不要不承認,就問你最常見的,瀏覽器每天用不?淘寶經常逛不?你在搜索框裡輸入幾個文字,按下回車,就出來大量結果,你想想這是怎麼辦到的,是正則表達式,可以好不誇張的講,沒有正則表達式,就沒有搜尋引擎。估計不少人還是雲裡霧裡,OK,大家先看看下面這兩張網頁截圖。

看看畫紅線的部分,為什麼你輸入什麼文字,網址裡面(也就是藍框所圈住部分)就會出現什麼文字。我現在告訴你,你之所以能在搜索框裡輸入幾個文字,按下回車,就出來大量結果,是因為瀏覽器已經幫你生成了正則表達式,也就是藍框所圈住的那一部分內容。當然搜尋引擎絕不止正則表達式這麼簡單,但正則表達式無疑佔據了最核心的部位。

說了這麼多,那什麼是正則表達式呢?百度百科中給了這樣一個解釋,「正則表達式,又稱規則表達式(英語:Regular Expression,在代碼中常簡寫為regex、regexp或re),是計算機科學的一個概念。正則表達式通常被用來檢索、替換那些符合某個模式(規則)的文本」,那使用正則表達式的目的是什麼呢?百度百科中只寫了兩句話:

1. 給定的字符串是否符合正則表達式的過濾邏輯(稱作「匹配」);

2. 可以通過正則表達式,從字符串中獲取我們想要的特定部分。

大家可以簡單的理解為兩點:search和match。OK,了解了正則表達式的概念和作用,我們趕緊進入Python的學習吧!正則表達式不是Python獨有的武器,但Python中的正則表達式無疑是最簡單卻又最強大的。在Python中使用正則表達式,需要導入re模塊,如下圖所示。

先給出一個小例子,如下圖所示,怎麼樣才能在列表list1中找出以py開頭的字串呢?

有小夥伴想出了一個法子,用的是for/in語句和if/else語句,如下圖。

OK,還有其他方法嗎,有小夥伴受上面代碼啟發,寫了個列表生成式。

也挺簡單是不,似乎這些地方用不著正則表達式,那我現在給出下面一個字符串,要求把字符串中所有的數字都提取出來,比如字符串'ab23fd5g67',我們需要提取出23、5、67,注意不能把數字分開哈!該怎麼辦,小夥伴們好好想想,再想用上面的方法實現就比較困難了吧!下面就該正則表達式出場了。

完美實現,是不是對正則表達式充滿興趣了呢!OK,接下來我們就依次學習一下re模塊的各個方法吧。

match方法用於嘗試從字符串的起始位置匹配一個正則表達式,如果匹配成功則返回一個match對象,如果沒有匹配成功,就返回None。pattern指的是匹配的正則表達式,string指的是用於匹配的字符串,flags是標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。

小夥伴急了,等等,蘇蘇,你還沒告訴我怎麼書寫一個正則表達式呢?

不要急,我們接下來就以match方法為測試對象教大家書寫一個正則表達式。首先我給出一個簡單的字符串'hello world',大家看什麼樣的正則表達式能匹配它,我先給出一個,大家請看。

先解釋一下,Match對象的group(0)用於返回匹配的整個字符串,span()方法用於以元祖形式返回匹配的起始位置和結束位置。

大家可以看到成功匹配了,這時有人會問了,不是說要寫正則表達式嗎?你寫個'hello world'幹嘛,我告訴你'hello world'也是一個正則表達式,只不過它只能匹配字符串'hello world'或以'hello world'開頭的字符串而已。OK,大家再看看如何匹配下面的三個字符串。

這時用上面的小把戲就沒用了,我總不能再寫三個一模一樣的字符串來匹配吧,大家可以看到三個字符串的開頭結尾都一樣,就中間字符不一樣,那我們可以這樣寫。

大家可以看出正則表達式m成功匹配出上面三個字符串,為什麼它可以做到呢,我們分析一下,正則表達式為r'T[io]+m',最前面的T和最後面的m就不講了,大家一看便知,我們重點講一下中間的 [io]+,[io]表示匹配的字符可以是中括號中的任意一個i或o,而後面跟著的+號表示可以對[io]匹配一次或多次。所以只要滿足這一條件的字符串都是可以被匹配的。

OK,接下來我想寫一個正則表達式,用來匹配僅以數字組成的字符串,大家看怎麼實現。

解釋一下:符號^匹配行首,符合$匹配行尾,中括號裡的內容表示字符串中所能包括的字符,不過,這樣寫是不是有點笨拙,我要是要求寫一個能匹配所有僅以字母組成的字符串的正則表達式,你還不得把26個字母寫全了,加上大寫,一共52個,多費勁。大家不必擔心,你能想到的,Python早就想到了,Python還支持這樣寫。

很方便吧,其實還有更簡單的,即使用正則表達式中的特殊字符,(~ ̄▽ ̄)~,說到特殊字符,其實上面已經講了一點了,^、$、- 都是特殊字符。不過特殊字符絕不止這麼點,接下來,我們就一起學習一下吧!請看Python文檔。

『.』用於匹配除換行符(\n)之外的所有字符。『^』用於匹配字符串的開始,即行首。『$』用於匹配字符串的末尾(末尾如果有換行符\n,就匹配\n前面的那個字符),即行尾。『*』用於將前面的模式匹配0次或多次(貪婪模式,即儘可能多的匹配)『+』用於將前面的模式匹配1次或多次(貪婪模式)『?』用於將前面的模式匹配0次或1次(貪婪模式)『*?,+?,??』即上面三種特殊字符的非貪婪模式(儘可能少的匹配)。『{m,n}』用於將前面的模式匹配m次到n次(貪婪模式),即最小匹配m次,最大匹配n次。『{m,n}?』即上面『{m,n}』的非貪婪版本。『\\』:'\'是轉義字符,在特殊字符前面加上\,特殊字符就失去了其所代表的含義,比如\+就僅僅代表加號+本身。『[]』用於標示一組字符,如果^是第一個字符,則標示的是一個補集。比如[0-9]表示所有的數字,[^0-9]表示除了數字外的字符。『|』比如A|B用於匹配A或B。『(...)』用於匹配括號中的模式,可以在字符串中檢索或匹配我們所需要的內容。

再說一下,字符串的前面加上字母r就表示raw string,也叫原始字符串。為什麼要有原始字符串呢?舉個例子,我的D盤下有個newProject的文件夾,而在我的某個程序中正好需要這個文件夾的路徑,我們在Python中寫一下,大家看看效果。

這不是我想要的結果啊,為什麼會這樣,原來Python把路徑中的\n當成了換行符,那該怎麼辦呢?前面加個r試試。

怎麼樣,可以吧,當然你也可以用轉義字符\來實現同樣的功能,在\n前面加上一個反斜槓\,\n就不代表換行符了,僅僅是字符『\n』。

Python中還有其他轉義字符,在這兒再一併介紹下。

\A:表示從字符串的開始處匹配\Z:表示從字符串的結束處匹配,如果存在換行,只匹配到換行前的結束字符串。\b:匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'py\b' 可以匹配"python" 中的 'py',但不能匹配 "openpyxl" 中的 'py'。\B:匹配非單詞邊界。 'py\b' 可以匹配"openpyxl" 中的 'py',但不能匹配"python" 中的 'py'。\d:匹配任意數字,等價於 [0-9]。\D:匹配任意非數字字符,等價於 [^\d]。\s:匹配任意空白字符,等價於 [\t\n\r\f]。\S:匹配任意非空白字符,等價於 [^\s]。\w:匹配任意字母數字及下劃線,等價於[a-zA-Z0-9_]。\W:匹配任意非字母數字及下劃線,等價於[^\w]\\:匹配原義的反斜槓\。

OK,今天的內容差不多了,上面講的特殊字符大家再多複習複習,我們在下次講解中結合re模塊的方法再具體進行闡述。謝謝大家的關注和閱讀,還有更多的精彩美文,記得第一時間來閱讀哈!

相關焦點

  • 學習Python正則表達式
    Python中的正則表達式(re)就可以解決這個問題!正則表達式正則表達式是一個具有特殊字符的序列。它有助於檢查字符串中的每個字符,看它是否與某個模式匹配:哪些字符在什麼位置出現了多少次。result = re.findall(r』\d』, text)這將返回所有數字,但每個元素只有一個數字:['1', '0', '0', '1', '1', '1', '1', '2', '3', '4', '5', '6', '7']r-python原始字符串這裡,r表示python原始字符串。
  • Python正則表達式:特殊符號和字符
    正表達式為高級的文本模式匹配,抽取,與/或文本形式的搜索和替換功能提供了基礎。簡而言之,正則表達式(簡稱regex)是由一些字符和特殊符號組成的字符串,它描述了模式的重複或者表達多個字符。python通過標準庫中的re模塊來支持正則表達式。
  • 代碼詳解:Python正則表達式的終極使用指南
    但如果有re模塊,則只需兩行代碼:import repattern = r"[;.,–]"print(len(re.findall(pattern,string)))-19本文討論的是最常用的正則表達式模式,以及一些經常使用的正則表達式函數。什麼是正則表達式?
  • python正則表達式使用方法說明
    曾光紅/文 (同步發布豆瓜網)一、導入re庫python使用正則表達式要導入re庫。import re在re庫中。正則表達式通常被用來檢索查找、替換那些符合某個模式(規則)的文本。二、使用正則表達式步驟1、尋找規律;2、使用正則符號表示規律;3、提取信息,如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。
  • Python:正則表達式基本符號總結
    字符串是我們在編程的時候很常用的一種數據類型,檢查會在字符串裡面查找一些內容,對於比較簡單的查找,字符串裡面就有一些內置的方法可以處理,對於比較複雜的字符串查找,或者是有一些內容經常變化的字符串裡面查找,那麼字符串內置的查找方法已經不好使了,滿足不了我們的要求,這個時候就得用正則表達式了,正則表達式就是用來匹配一些比較複雜的字符串。
  • Python 正則表達式-函數用法分析
    Python正則表達式的主要作用是檢索、替換符合匹配規則的文本,什麼時候檢索,什麼時候替換,我們根據需求,選擇最合適的函數。【函數一】compile(pattern, flags=0)我們編寫的正則表達式 pattern,指定使用的模式 flags 默認為0 即不使用任何模式【函數二】 purge()這個函數的作用是清除緩存中的正則表達式【函數三】escape(pattern)如果需要操作的文本中含有正則的元字符時,需要將元字符加上反斜扛
  • Python正則表達式由淺入深(二)
    在前兩篇連載文章中,我們學習了re模塊的match()、search()、findall()方法,以及學習了使用正則表達式中常用的元字符、限定符、選擇字符、中括號來搭配這些方法來靈活處理常見的數據匹配問題。這本篇文章分鐘,我們將會進一步學習正則表達式中其他符合,包括令初學者非常頭疼的分組問題。
  • Python程式語言:如何運用正則表達式
    這篇文章,小編要和大家分享的知識是Python語言的正則表達式,以及自己學到的使用方法!學會正則表達式可以幫助我們抓取網絡信息,正則表達式又叫Re庫!這裡我們要了解什麼是正則表達式,正則表達式是用來簡潔表達一組字符串的表達式!
  • 正則表達式B - 實際表單小例子
    正則表達式的實際運用 數字、字母、下劃線組成的6-15位字符,且不能以數字開頭 編寫思路詳解:1.首先獲取input按鈕 2.然後我們要在用戶輸入完之後檢測,所以可以用onchange改變之後 3.然後再獲取用戶輸入的內容val = this.value 4.獲取內容後對其內容進行用正則表達式檢測 reg = /^
  • 【第160期】指尖上的正則表達式–入門篇
    Unix之父將此符號系統引入編輯器QED,然後是Unix上的編輯器ed,並最終引入grep。Jeffrey Friedl 在其著作「Mastering Regular Expressions (2nd edition)」中對此作了進一步闡述講解,如果你希望更多了解正則表達式理論和歷史,推薦你看看這本書。
  • Python正則表達式由淺入深(一)
    幸運的是Python提供了re模塊,可以實現正則表達式的操作。re模塊主要通過六大方法來對字符串進行處理,包括:match()、search()、findall()、split()、sub()。這些方法涉及到字符串的匹配與替換等操作,在接下來的4篇連載文章裡,我們不單只會講解這4種方法,還會把元字符、行定位符、限定符、字符類、排除字符、選擇字符、轉義字符、分組等正則表達式最常用知識點貫穿起來。
  • 正則表達式的基礎知識和Python中的基本應用
    第八十一節:正則表達式正則表達式又叫「規則表達式」(Regular Expression),簡稱RE,是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。
  • 正則表達式在VBA中間是如何應用?正則表達式的實現方式?
    Hi,大家好,本章節開始將會從零開始和大家用圖文的方式,讓你從零基礎學會正則表達式!有興趣的小夥伴可以持續關注我,或者在專欄中進行查看自我學習,願與君攜手前行!在上一個章節說到正則表達式的入門級知識點,本節將會與大家分享一下正則表達式的是具體實現方式是怎麼樣的?
  • Python(2):正則表達式的常見符號與作用,每個都有示例
    承接上篇文章,本文將羅列出Python中正則表達式常用的符號,也叫做元字符,正是憑藉元字符正則表達式方才展現出強大的檢索功能和受人青睞的靈活性。常見的正則表達式特殊符號為了便於讀者保存,這裡把符號以表格圖片的形式總結給大家,並就常見的正則表達式給出簡單的示例供大家參考、學習。點號(.)-匹配除換行符\n外的任意單個字符示例:a.o—匹配字母a和o且二者中間為任意單字符的字符串,如axo,a!
  • Python中使用re模塊實現正則表達式的匹配字符串操作
    第八十二節:匹配字符串經過上一節比較枯燥的基礎內容,今天來看看如何利用正則表達式在Python中進行具體操作。在Python中使用正則表達式,首先要導入一個re模塊。re就是Regular Expression(正則表達式)的縮寫,所以導入re模塊就是導入「正則表達式模塊」。
  • 給JAVA程式設計師的正則表達式一課
    「不會正則表達式,就算寫遍代碼也嘛不是」。說到正則表達式,可能動態語言的碼農Perl,Python,JS甚至是Golang的開發人員可能都熟悉。對Java碼農來說,可能CURD手到擒來,Spring Stuts Hibernat耳聞能詳,但是說到Regex RE模式,可能熟練的少。那麼,今天蟲蟲就來給廣大Java碼農來補補正則的課。
  • 使用JavaScript對正則表達式進行解析
    我的目的不是要嚇你,一旦我們了解了正則表達式那它就變得很簡單:讓人畏懼.....今天,我們將揭開正則表達式的神秘面紗,看到它的含義,它的用途以及如何設計正則表達式來解決問題。1、什麼是正則表達式?正則表達式是描述數據字符串中模式的一種方式。
  • 正則表達式A - 方法及特殊字符用法
    課程大綱 1.正則表達式的概念及作用 2.正則表達式的創建方法 3.正則表達式的用法 正則表達式概念: 正則表達式是由普通字符及特殊字符組成的對字符串進行過濾的邏輯公式 正則表達式的創建方式: 1.字面量方式創建 (隱式創建): var reg = /正則表達式/gi;
  • PHP正則表達式的快速學習方法
    舉例來說,正則表達式的一個最為普遍的應用就是用於驗證用戶在線輸入的郵件地址的格式是否正確。如果通過正則表達式驗證用戶郵件地址的格式正確,用戶所填寫的表單信息將會被正常處理;反之,如果用戶輸入的郵件地址與正則表達的模式不匹配,將會彈出提示信息,要求用戶重新輸入正確的郵件地址。由此可見正則表達式在WEB應用的邏輯判斷中具有舉足輕重的作用。
  • 正則表達式:如何匹配一個或多個字符?
    讀懂正則表達式就這麼簡單匹配純文本Ben是一個正則表達式。因為本身是純文本,所以看起來可能不像是一個正則表達式,但它的確是。正則表達式可以包含純文本(甚至可以只包含純文本)。當然,像這樣使用正則表達式是一種浪費,但把它作為我們學習正則表達式的起點還是很不錯的。