Python正則表達式由淺入深(一)

2021-01-11 CDA數據分析師

CDA數據分析師 出品

數據分析工作中很多任務是跟文本處理相關,比如從文本中提取客戶的信息,從文本中提取時間等等都是比較常見的操作。 雖然Python處理字符串的方法很多,而且流行的pandas庫也提供了大量的向量化字符串方法,但是一旦涉及要經過較為複雜的數據匹配才能進行的字符操作,這些方法就顯得非常的乏力。

尤其是由於文本數據來源於爬蟲等渠道,數據往往嚴重不規整,這時候文本處理起來就顯得尤為吃力。

幸運的是Python提供了re模塊,可以實現正則表達式的操作。re模塊主要通過六大方法來對字符串進行處理,包括:match()、search()、findall()、split()、sub()。

這些方法涉及到字符串的匹配與替換等操作,在接下來的4篇連載文章裡,我們不單只會講解這4種方法,還會把元字符、行定位符、限定符、字符類、排除字符、選擇字符、轉義字符、分組等正則表達式最常用知識點貫穿起來。

接下來的系列文章將會為大家初步搭建較為完整的Python正則表達式知識體系,如果你已經學習完Python編程基礎和數據清洗的課程知識,該系列文章將會讓你對使用Python正則表達式達到一學就會,一用就懂的技能熟悉程度,實現真正的融會貫通的目的。

re.match方法

我們首先看re模塊中較為簡單的match()方法。

match 的作用是利用 Pattern 實例,從字符串左側開始匹配,如果匹配到就返回一個 Match 實例,如果第一個字符不符合條件,就返回 None。其語法格式如下:

re.match(pattern,string,[flags])

· pattern:表示模式字符串,由要匹配的正則表達式轉換而來。

· string:表示要匹配的字符串。

· flags:可選參數,表示標誌位,這個參數我們後續再講。

模式字符串是什麼意思呢?先看以下例子:

pattern='企業名稱'

message='企業名稱:CDA數據科學研究院'

match = re.match(pattern, message)

match

Out:<re.Match object; span=(0, 4), match='企業名稱'>

這時我們發現,re.match()方法返回了一個re.match對象,但這對象裡面的信息什麼意思呢?

在上面的例子中,我們的模式字符串沒有使用任何其他特殊字符,只是"企業名稱"。

而字符串message前面幾個字符串剛好是"企業名稱",因此返回來的re.match對象可以解讀出以下信息:

· "企業名字"這幾個字符串能在message中索引區間span(0,4)中匹配上

· 匹配結果就是match='企業名稱'

另外,re.match對象還可以通過調用.start()方法以及.end()來獲取匹配值的開始和結束位置:

match.start()

match.end()

也可以通過.span()方法獲得記載匹配字符所處位置索引的元組:

match.span()

Out: (0, 4)

在message中被匹配上的字符串可以通過.group()方法獲得:

match.group()

Out:'企業名稱'

被匹配的字符串可以通過re.match對象的string屬性來調用:

match.string

Out:'企業名稱:CDA數據科學研究院'

re.search方法

如果說,要匹配字符串並非出現在message的開頭,而是中間,match()方法就沒辦法匹配上了,這時候可以使用re.search()方法。

比如我們想要匹配message中的"CDA數據科學院研究院",我們將pattern指向對象改成"企業名稱",調用re.search()方法即可:

pattern='CDA數據科學研究院'

message='企業名稱:CDA數據科學研究院'

search = re.search(pattern, message)

search

Out:<re.Match object; span=(5, 15), match='CDA數據科學研究院'>

值得注意的是,re.search()方法結果返回的也是re.match對象,因此前面提及到的該類對象的方法和屬性同樣可以調用。

search.start()

search.end()

search.span()

search.group()

search.string

Out:5

15

(5, 15)

'CDA數據科學研究院'

'企業名稱:CDA數據科學研究院'

元字符

好,我們繼續思考,如果我們想要將message中"CDA"後面的一個字符也匹配上,pattern該如何寫?

pattern='CDA.'

message='企業名稱:CDA數據科學研究院\n郵箱:1918560461@qq.com'

search = re.search(pattern, message)

search

Out:<re.Match object; span=(5, 9), match='CDA數'>

通過上面的例子我們會發現,message中字符串"CDA"後面的"數"字也匹配上了,這只需要在設置pattern的時候,在字符串"CDA"後面多加一個圓點,而這圓點的作用就是可以幫你匹配除了換行符以外的任意字符。

除此之外,我們還可以把圓點換成"\w",最終效果也是一樣的:

pattern='CDA\w'

message='企業名稱:CDA數據科學研究院\n郵箱:1918560461@qq.com'

search = re.search(pattern, message)

search

Out:<re.Match object; span=(5, 9), match='CDA數'>

"\w"的作用就是可以幫你匹配字符、數字、下劃線或者是漢字。

而這些符號叫做元字符。

除了圓點和"\w"以外,還有以下元字符:

這裡需要注意的是,由於元字符大多數都包含特殊字符和反斜槓,因此,為了匹配原生字符串,可以在元字符之前添加r或R,如:

pattern=r'\bCDA.{5}' # 在元字符之前添加r

message='企業名稱:經管之家CDA數據科學研究院 CDA數據分析師\n郵箱:1918560461@qq.com'

search = re.search(pattern, message)

print(search)

Out:<re.Match object; span=(20, 28), match='CDA數據分析師'>

在上面的例子中,我們還需要注意的就是,由於模式字符串中帶有元字符"\b",而"\b"會匹配分界符(空格,標點符號或換行符)。

因此messgae中左邊起第一個"CDA"字符串前面由於沒有分界符,最終匹配的是第二個"CDA"字符串。

那麼上面模式字符串中出現的花括號"{}"是什麼意思呢?這就是我們接下來要講解的限定符。

限定符

前面學習了元字符,我們配合re.match()方法和re.search()方法就可以進行非常靈活的字符匹配。

但是只有元字符還有很多地方無法解決,比如,我們希望匹配字符串'企業名稱:CDA數據科學研究院\n郵箱:1918560461@qq.com'中的郵箱,該怎麼辦?

這個時候,我們就可以在模式字符串中添加限定符:

pattern='郵箱:.{17}'

message='經管之家CDA數據科學研究院\n郵箱:1918560461@qq.com'

search = re.search(pattern, message)

print(search)

Out:<re.Match object; span=(15, 35), match='郵箱:1918560461@qq.com'>

上面的patrern參數設置的原理是:既然是要匹配出message中的郵箱信息,而郵箱信息是在messaage中字符串"郵箱:"的後面,如果郵箱信息的長度為1,pattern可以寫成"郵箱:.".

但是該郵箱信息長度為17個字符,也就是說,要匹配message中"郵箱:"後面的17個字符,這時在上面的pattern後面添加限定符"{17}"就可以匹配17個字符(不包括換行符)。

但是如果郵箱信息長度不是為17,那該怎麼辦?由於郵件信息就是在message中字符串"郵箱:"的後面一直到末端,因此我們可以這樣寫:

pattern='郵箱:.*'

message='經管之家CDA數據科學研究院\n郵箱:1918560461@qq.com'

search = re.search(pattern, message)

print(search)

Out:<re.Match object; span=(15, 35), match='郵箱:1918560461@qq.com'>

除了上面提及的"{n}"和"*"以外,還有那些常用的限定符呢?

這裡需要給大家一個提醒的是,由於元字符"."是匹配除了換行符以外的任意字符,因此,即使我們的message中,郵箱信息後面如果有換行,上面的方法依然可以匹配出郵箱信息,比如:

pattern='郵箱:.*'

message='企業名稱:CDA數據科學研究院\n郵箱:1918560461@qq.com\n地址:北京市海澱區廠窪街3號2號樓2-3層\n網址:www.cda.cn'

search = re.search(pattern, message)

print(search)

Out:<re.Match object; span=(16, 36), match='郵箱:1918560461@qq.com'>

但是,如果上面的message中"地址"兩個字的前面沒有換行符"\n"呢?該如何匹配出郵箱信息?

我們只需要在pattern中星號的後面加上郵箱地址最後的字符"com"作為匹配的結束即可:

pattern='郵箱:.*com'

message='企業名稱:CDA數據科學研究院\n郵箱:1918560461@qq.com地址:北京市海澱區廠窪街3號2號樓2-3層\n網址:www.cda.cn'

search = re.search(pattern, message)

print(search)

Out:<re.Match object; span=(16, 36), match='郵箱:1918560461@qq.com'>

相關焦點

  • Python正則表達式由淺入深(二)
    在前兩篇連載文章中,我們學習了re模塊的match()、search()、findall()方法,以及學習了使用正則表達式中常用的元字符、限定符、選擇字符、中括號來搭配這些方法來靈活處理常見的數據匹配問題。這本篇文章分鐘,我們將會進一步學習正則表達式中其他符合,包括令初學者非常頭疼的分組問題。
  • 學習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「正則表達式」詳解(上)
    大家好,今天我們一起學習以下Python中的「正則表達式」,說到正則表達式,大家可能比較陌生,不過我卻要告訴你,你每天都在使用正則表達式,不要不承認,就問你最常見的,瀏覽器每天用不?淘寶經常逛不?你在搜索框裡輸入幾個文字,按下回車,就出來大量結果,你想想這是怎麼辦到的,是正則表達式,可以好不誇張的講,沒有正則表達式,就沒有搜尋引擎。
  • python正則表達式使用方法說明
    曾光紅/文 (同步發布豆瓜網)一、導入re庫python使用正則表達式要導入re庫。import re在re庫中。正則表達式通常被用來檢索查找、替換那些符合某個模式(規則)的文本。二、使用正則表達式步驟1、尋找規律;2、使用正則符號表示規律;3、提取信息,如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。
  • Python:正則表達式基本符號總結
    字符串是我們在編程的時候很常用的一種數據類型,檢查會在字符串裡面查找一些內容,對於比較簡單的查找,字符串裡面就有一些內置的方法可以處理,對於比較複雜的字符串查找,或者是有一些內容經常變化的字符串裡面查找,那麼字符串內置的查找方法已經不好使了,滿足不了我們的要求,這個時候就得用正則表達式了,正則表達式就是用來匹配一些比較複雜的字符串。
  • 代碼詳解:Python正則表達式的終極使用指南
    雖然想要實現上述功能聽起來很繁瑣,但是如果使用Python正則表達式模塊,就可以使這一操作更加簡單。假設要在一篇特定的文章中找出標點符號的數量。以狄更斯的作品文本為例。你通常會怎麼做?但如果有re模塊,則只需兩行代碼:import repattern = r"[;.,–]"print(len(re.findall(pattern,string)))-19本文討論的是最常用的正則表達式模式,以及一些經常使用的正則表達式函數。什麼是正則表達式?
  • Python 正則表達式-函數用法分析
    Python正則表達式的主要作用是檢索、替換符合匹配規則的文本,什麼時候檢索,什麼時候替換,我們根據需求,選擇最合適的函數。【函數一】compile(pattern, flags=0)我們編寫的正則表達式 pattern,指定使用的模式 flags 默認為0 即不使用任何模式【函數二】 purge()這個函數的作用是清除緩存中的正則表達式【函數三】escape(pattern)如果需要操作的文本中含有正則的元字符時,需要將元字符加上反斜扛
  • Python程式語言:如何運用正則表達式
    這篇文章,小編要和大家分享的知識是Python語言的正則表達式,以及自己學到的使用方法!學會正則表達式可以幫助我們抓取網絡信息,正則表達式又叫Re庫!這裡我們要了解什麼是正則表達式,正則表達式是用來簡潔表達一組字符串的表達式!
  • 正則實戰秘籍進階-【溫度轉換小程序】
  • 正則表達式的基礎知識和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模塊就是導入「正則表達式模塊」。
  • 【第160期】指尖上的正則表達式–入門篇
    正則表達式被作為用來描述其稱之為「正則集的代數」的一種表達式,因而採用了「正則表達式」這個術語。之後一段時間,人們發現可以將這一工作成果應用於其他方面。Ken Thompson就把這一成果應用於計算搜索算法的一些早期研究,Ken Thompson是 Unix的主要發明人,也就是大名鼎鼎的Unix之父。
  • 給JAVA程式設計師的正則表達式一課
    「不會正則表達式,就算寫遍代碼也嘛不是」。說到正則表達式,可能動態語言的碼農Perl,Python,JS甚至是Golang的開發人員可能都熟悉。對Java碼農來說,可能CURD手到擒來,Spring Stuts Hibernat耳聞能詳,但是說到Regex RE模式,可能熟練的少。那麼,今天蟲蟲就來給廣大Java碼農來補補正則的課。
  • 使用JavaScript對正則表達式進行解析
    我的目的不是要嚇你,一旦我們了解了正則表達式那它就變得很簡單:讓人畏懼.....今天,我們將揭開正則表達式的神秘面紗,看到它的含義,它的用途以及如何設計正則表達式來解決問題。1、什麼是正則表達式?正則表達式是描述數據字符串中模式的一種方式。
  • 正則表達式:如何匹配一個或多個字符?
    讀懂正則表達式就這麼簡單匹配純文本Ben是一個正則表達式。因為本身是純文本,所以看起來可能不像是一個正則表達式,但它的確是。正則表達式可以包含純文本(甚至可以只包含純文本)。當然,像這樣使用正則表達式是一種浪費,但把它作為我們學習正則表達式的起點還是很不錯的。
  • PHP正則表達式的快速學習方法
    此外,象JavaScript這種客戶端的腳本語言也提供了對正則表達式的支持。由此可見,正則表達式已經超出了某種語言或某個系統的局限,成為人們廣為接受的概念和功能。正則表達式可以讓用戶通過使用一系列的特殊字符構建匹配模式,然後把匹配模式與數據文件、程序輸入以及WEB頁面的表單輸入等目標對象進行比較,根據比較對象中是否包含匹配模式,執行相應的程序。