Python案例|Pandas正則表達式

圖片

字符串的處理在數據清洗中占比很大。也就是說,很多不規則的數據處理都是在對字符串進行處理。Excel提供了拆分、提取、查找和替換等對字符串處理的技術。在Pandas中同樣提供了這些功能,并且在Pandas中還有正則表達式技術的加持,讓其字符串處理能力更加強大。

01、正則

正則就是正則表達式(Regular Expression)的簡稱,它是一種強大的文本處理技術。正則表達式描述了字符串匹配的模式(Pattern),可以用來檢查一個字符串是否含有某種子字符串,對匹配成功的字符串可以進行提取、拆分、查找和替換等處理。大部分的編程語言支持正則表達式,匹配規則也基本相同,但不同編程語言的處理方式略有不同。

在實際工作中,用戶需要的多條有用信息很可能會混雜在一起,要將這些雜亂的數據整理規范,很可能就需要正則表達式的加持。在Pandas中提供的很多關于文本處理的函數支持正則表達式,所以在講解Pandas的文本處理函數之前,首先要詳細了解正則表達式技術。

1正則表達式的導入與創建

要在Python中使用正則表達式,首先要導入re庫,它是Python的內置庫,也就是說不需要用戶安裝; 接下來演示一下直接導入使用和通過編譯后再使用兩種方法。

1.直接導入使用

在導入re庫之后,直接使用re.函數()的方式來使用正則表達式,例如使用re.findall()函數,示例代碼如下:

import re  #導入正則表達式庫
print (re.findall(r' d','9527') )  #直接調用正則表達式函數使用
print (re.findall(r' d','5201314'))  #直接調用正則表達式函數使用

?運行結果如下:

圖片

2.通過編譯使用

如果需要重復使用一個正則表達式對象,則可以將正則表達式預編譯成正則表達式對象,這樣效率更高。在導入re庫后,將正則表達寫入re.compile()函數,然后生成正則表達式對象,再調用這個對象中的函數進行處理,示例代碼如下:

import re  #導入正則表達式庫
pat=re.compile(r'\d') #使用 compile 函數生成正則表達式對象
print(pat.findall('5201314'))  #調用編譯后的正則表達式對象中的函數使用 
print (pat.findall('9527') )   #調用編譯后的正則表達式對象中的函數使用

?運行結果如下:

圖片

?

預編譯的方式也可以直接寫成一條代碼,如re.compile(r'\d').findall('9527')。不管正則表達式采用何種調用方式,始終脫離不了以下三要素。

(1) 正則表達式字符串。如r'\d',單引號中的字符串表明匹配規則,\d是查找單個數字的意思。

(2) 正則表達式被匹配的字符串。如'9527',對'9527'執行r'\d' 的匹配,意思就是查找'9527'中有多少個單數字。

(3) 匹配成功后的處理方式。例如調用findall()函數,表示如果匹配成功,則將查找出來的單個數字存儲在列表中。

在上面的三要素中,需要重點學習正則表達式字符串的編寫規則,以及匹配成功后的處理方式。

2正則表達式處理函數

本來應該先講解正則表式的編寫規則,但讀者可能更希望正則表達式匹配成功后,能看到對應的處理結果,這樣能有更直觀的感受,所以本節先講解正則表達式的常用函數。

本節在講解正則表達式函數時,會分別講解直接寫法(re.函數())和預編譯寫法(regex.函數())兩種形式,雖然這兩種書寫形式對應的函數名一樣,功能也一樣,但函數的參數略有差異。

在Python的正則表達式中,使用不同函數,其返回的數據類型也不一樣,例如返回re.Match(匹配對象)、list(列表)、iterator(迭代器)、str(字符串)等,其中返回的re.Match匹配對象存儲有更多信息。

1. 從開始位置匹配(match()函數)

如果希望從字符串的開始位置匹配,則可以使用match()函數。如果匹配成功,則match()函數返回的是一個re.Match匹配對象。

1) re.match()函數

re.match()函數的參數說明如下。

re.match(pattern, string, flags=0)

pattern: 匹配的正則表達式。

string: 要匹配的字符串。

flags: 標志位,用于控制正則表達式的匹配方式,見表1。

■?表1 常見正則表達式flags的匹配模式

圖片

re.match()函數的示例代碼如下:

import re   #導入正則表達式庫
print(re.match(r'apple','apple 蘋果') ) #在'apple 蘋果'字符串中以 apple'開頭
print (re.match(r'蘋果','apple 蘋果'))  #在'apple 蘋果,字符串中以,蘋果'開頭

?運行結果如下:

圖片

2) regex.match()函數

regex.match()函數的參數說明如下。

regex.match(string[, pos[, endpos]])

string: 必選,被匹配的字符串。

pos: 可選,指定起始位置。

endpos: 可選,指定結束位置。

注意: regex為正則表達式對象的統稱。

regex.match()函數的示例代碼如下:

import re   #導入正則表達式庫
print(re.compile(r'apple').match('apple 蘋果'))  #在'apple 蘋果'字符串中以apple'開頭
print(re.compile(r'蘋果') .match('apple 蘋果'))  #在'apple 蘋果,字符串中以,蘋果"開頭

?運行結果如下:

圖片

通過運行結果發現,第1個測試匹配成功,返回re.Match對象,其中span=(0, 5)表示匹配成功的字符串的起止位置。第2個測試沒有匹配成功,返回值為None。

還有一個與match()函數相似的fullmatch()函數,該函數完整匹配整個字符串。先演示一下re.fullmatch()函數,示例代碼如下:

import re  #導入正則表達式庫
print (re.fullmatch(r'apple 蘋果',apple 蘋果'))    #在 apple 蘋果'字符串中匹配apple 蘋果,
print (re.fullmatch (r'apple','apple 蘋果') )       #在 apple 蘋果,字符串中匹配
'apple'

?運行結果如下:

圖片

接下來演示regex.fullmatch()函數,示例代碼如下:

import re  #導入正則表達式庫
print (re.compile(r'apple 蘋果').fullmatch('apple 蘋果')) #在'apple蘋果'字符串中匹配'apple 蘋果print(re.compile(r'apple') .fullmatch('apple 蘋果'))  #在 apple 蘋果'字符串中匹配'apple

?運行結果如下:

圖片

通過上面的示例會發現,只有完整匹配了整個字符串,才能匹配成功,否則返回值為None,并且在示例中會發現,只有匹配的字符串與被匹配的字符串相等才可以成功。是不是匹配與被匹配的字符串一定要相等呢? 其實并非如此,可以寫更復雜的正則表達式字符串,只要從開頭到結尾都能匹配成功就可以。

2. 從任意位置匹配(search()函數)

match()函數必須從指定的起始位置開始匹配,如果希望從任意位置開始匹配,則可以使用search()函數。如果匹配成功,則返回re.Match配匹對象,否則返回值為None。

1) re.search()函數

re.search()函數的參數說明如下。

search(pattern, string, flags=0)

pattern: 匹配的正則表達式。

?

string: 要匹配的字符串。

flags: 標志位,用于控制正則表達式的匹配方式,見表6-1。

re.search()函數的示例代碼如下:

import re  #導入正則表達式庫
print (re.search(r'apple',3 個apple蘋果')) #在3個apple 蘋果'字符串中搜索apple"
print(re.search(r'apple',apple 蘋果3 個')) #在3個apple 蘋果'字符串中搜索apple"
print (re.search(r'梨子','apple 蘋果3個')) #在'apple 蘋果3 個1字符串中搜索'梨子

運行結果如下:

圖片

2) regex.search()函數

regex.search()函數的參數說明如下。

regex.search(string[, pos[, endpos]])

string: 必選,被匹配的字符串。

pos: 可選,指定起始位置。

endpos: 可選,指定結束位置。

regex.search()函數的示例代碼如下:

?

import re#導入正則表達式庫
print(re.compile(r'apple').search('3 個apple蘋果')) #在3個apple蘋果'字符串中搜索'apple'
print(re.compile(r'apple').search('apple 蘋果3個')) #在3個apple蘋果'字符串中搜索'apple'
print(re.compile(r'梨子').search('apple 蘋果3個')) #在apple蘋果3 個1字符串中搜索,梨子|

運行結果如下:

圖片

通過上面的示例會發現,只要被搜索的字符串包含要查找的字符串,最后都能匹配成功,并且返回re.Match對象。

注意: match()函數和search()函數在進行匹配時,可能有多個對象符合匹配要求,但只返回第1個匹配成功的re.Match對象。

3. 用列表存儲匹配成功的值(findall()函數)

前面學習的match()函數和search()函數只返回第1次匹配成功的re.Match 對象,如果希望返回所有匹配成功的數據,則可以使用findall()函數,返回的結果是列表類型; 如果沒有匹配成功,則返回空列表。

注意,findall()函數匹配出的數據只是從re.Match對象中提取出的信息之一。

1) re.findall()函數

re.findall()函數的參數說明如下。

re.findall(pattern,string,flags=0)

pattern: 匹配的正則表達式。

string: 要匹配的字符串。

flags: 標志位,用于控制正則表達式的匹配方式,見表1。

re.findall()函數的示例代碼如下:

txt='張三2李四3 王五 4 陳小兵 15 大龍' #被匹配的字符串
print (re.findall(r' D+\d+',txt)) #常規匹配
print (re.findall(r'(\D+)\d+',txt))#添加 1 組括號
print (re.findall(r'(\D+) (\d+)',txt)) #添加 1組以上括號

?運行結果如下:

圖片

2) regex.findall()函數

regex.findall()函數的參數說明如下。

regex.findall(string[, pos[, endpos]])

string: 待匹配的字符串。

pos: 可選參數,指定字符串的起始位置,默認值為0。

endpos: 可選參數,指定字符串的結束位置,默認值為字符串的長度。

regex.findall()函數的示例代碼如下:

import re  #導入正則表達式庫
txt='張三2李四3 王五 4 陳小兵 15 大龍'  #被匹配的字符串
print (re.compile(r'\D+\d+') .findall(txt))#添加 1 組括號
print (re.compile(r'(\D+) d+') .findall(txt)) #常規匹配
print(re.compile(r'(\D+) (\d+)').findall(txt)) #添加1組以上括號

?運行結果如下:

圖片

通過上面的示例會發現,findall()函數如果沒有分組,則直接返回匹配成功的所有字符串; 如果只有1個分組,則將分組中的值返回到列表; 如果多于1個分組,則列表中的每個元素是元組,元組中的元素就是每個分組中的值。

注意: findall()函數中的正則表達式字符是'\D+\d+ ',表示匹配連續的非數字和連續的數字,后面在講解正則表達式元字符時,會詳細講解\D與\d。

4. 用迭代器存儲匹配成功對象(finditer()函數)

finditer()函數與findall()函數的功能類似,其主要區別在于findall()函數匹配成功后返回的是列表,列表中存儲的是匹配成功的數據; 而finditer()函數匹配成功后返回的是迭代器,迭代器中存儲的是匹配成功的re.Match對象。

1) re.finditer()函數

re.finditer()函數的參數說明如下。

re.finditer(pattern, string, flags=0)

pattern: 匹配的正則表達式。

string: 要匹配的字符串。

flags: 標志位,用于控制正則表達式的匹配方式,見表1。

re.finditer()函數的示例代碼如下:

import re  #導入正則表達式庫
txt='張三2李四3 王五 4 陳小兵 15 大龍' #被匹配的字符串
print (re.finditer(r'\D+\d+',txt))  #常規匹配
print (re.finditer(r'( D+)\d+'txt))  #添加 1組括號
print (re.finditer(r'(\D+) (\d+)',txt)) :#添加 1 組以上括號

?運行結果如下:

圖片

2) regex.finditer()函數

regex.finditer()函數的參數說明如下。

regex.finditer(string[, pos[, endpos]])

string: 待匹配的字符串。

pos: 可選參數,指定字符串的起始位置,默認值為 0。

endpos: 可選參數,指定字符串的結束位置,默認值為字符串的長度。

regex.finditer()函數的示例代碼如下:

import re   #導入正則表達式庫
txt='張三 2 李四3 王五 4 陳小兵 15 大龍' #被匹配的字符串
print (re.compile(r' D+ \d+') .finditer(txt))#常規匹配
print (re.compile(r'(\D+)\d+') .finditer(txt))print (re.compile(r'(\D+)  #添加 1 組括號(\d+)').finditer(txt)) #添加1組以上括號

?運行結果如下:

圖片

通過上面的示例會發現,返回的是callable_iterator object(迭代器對象),迭代器中存儲的是每個匹配成功的re.Macth對象。也就是說finditer()函數與findall()函數相比而言,能獲取更多的信息。

finditer()函數匹配成功后,可以用循環語句讀取迭代器中的數據,也可以用list()函數對迭代器進行轉換,示例代碼如下:

import re #導入正則表達式庫
txt='張三2李四3 王五 4 陳小兵 15 大龍' #被匹配的字符串
print (list (re.compile(r'\D+\d+').finditer(txt))) #常規匹配

運行結果如下:

圖片

觀察運行結果可以發現,每次匹配成功后,返回的不是具體的值,而是re.Match對象。

02、文末送書

作為生產力工具,Python是當今極為流行的編程語言。Python編程逐漸成為一項通用能力,從小學生到各個行業的從業人員都在學Python。Python確實能夠在很多領域發揮作用,以至于Python編程已經成為一些職業的加分項甚至必備能力。

市面上的Python書繁多,新入行的朋友問的最多的問題就是如何挑選一本好的入門書?這真是個讓人很頭疼的問題!

  • 知識點堆砌,雜而不精脫

  • 離實際開發需求詳略

  • 設置不合理

  • 學習曲線過于陡峭

  • 案例過于炫技

  • 不注重學習過程和結果

以上是Python入門書的通病,今天推薦的這本《Python之光》,將重新定義Python學習:

圖片

?參與方式:文章三連并評論“零基礎學習Python,就用《Python之光》”參與抽獎,48小時后,評論區自動抽取5位幸運小伙伴每人送出1本(包郵到家哦)!

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39453.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39453.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39453.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TypeScript相關面試題

typeScript 1.什么是TypeScript?是什么?特性?區別? 2.TypeScript數據類型?3.說說你對 TypeScript 中枚舉類型的理解?應用場景?4.說說你對 TypeScript 中接口的理解?應用場景?使用方…

docker中的jenkins之流水線構建

docker中的jenkins之流水線構建項目 1、用node這種方式(因為我用pipeline方式一直不執行,不知道為什么) 2、創建項目 創建兩個參數,一個是宿主端口號,一個是docker中的端口號 3、使用git項目中的Jenkinsfile 4、編寫…

【AGI】世界首次實現室溫超導LK-99

論文:The First Room-Temperature Ambient-Pressure Superconductor GPT論文總結: 根據所提供的信息,這篇論文報道了一種在室溫和常壓下工作的室溫超導體LK-99。LK-99的超導性是通過微小的結構畸變引起的,而不是通過溫度和壓力等外…

09 - 連續的多個commit整理成1個

查看所有文章鏈接:(更新中)GIT常用場景- 目錄 文章目錄 將連續的多個commit整理成1個 將連續的多個commit整理成1個 將anranxiaohunzhang和xianglongshibazhang合并起來(將anranxiaohunzhang合并到降龍十八掌上,生成新…

java GC日志分析示例

分析 Java 的 GC 日志可以幫助您了解應用程序的垃圾回收情況,從而檢測內存泄漏、性能問題以及優化內存使用。下面是一些詳細的步驟和示例來分析 Java 的 GC 日志。 假設您有一個 Java 應用程序運行的 GC 日志文件,我們將使用以下示例日志進行解釋&#…

干翻Dubbo系列第十篇:Dubbo體系中ProtoBuf序列化方式詳解

文章說明 本文內容整理自《孫哥說Dubbo系列視頻課程》,孫帥老師課程細致、全面、深入、性價比極高。B站搜孫帥suns可以找到對應的試聽視頻,或者直接添加老師微信號suns45與他直接聯系 一:序列化概念 補充說明: Kyro和Fst這兩種…

設計模式-面試常問

1.單例模式 保證系統中,一個類,只有一個實例,并且提供對外訪問。 優點:只有一個對象,可以節省資源。適合頻繁創建銷毀對象的場景。 實現:要用到static,靜態私有對象。暴露單例的靜態方法。 &…

docker 學習--03 環境安裝(本人使用的win10 Linux也是在win10下模擬)

docker 學習–03 環境安裝(本人使用的win10 Linux也是在win10下模擬) docker 學習-- 01 基礎知識 docker 學習-- 02 常用命令 文章目錄 docker 學習--03 環境安裝(本人使用的win10 Linux也是在win10下模擬)[TOC](文章目錄) 1. wi…

【數學建模】邏輯回歸算法(Logistic Resgression)

邏輯回歸算法 簡介邏輯回歸與條件概率繪制sigmoid函數 簡介 邏輯回歸算法是一種簡單但功能強大的二元線性分類算法。需要注意的是,盡管"邏輯回歸"名字帶有“回歸”二字,但邏輯回歸是一個分類算法,而不是回歸算法。 我認為&#xff…

冉冉升起的星火,再度升級迎來2.0時代!

文章目錄 前言權威性評測結果 星火大模型多模態功能插件功能簡歷生成文檔問答PPT生成 代碼能力 福利 前言 前幾天從技術群里看到大家都在談論《人工智能大模型體驗報告2.0》里邊的內容,抱著好奇和學習的態度把報告看了一遍。看完之后瞬間被里邊提到的科大訊飛的星火…

2008-2020年全國各省綠色金融發展指數(含原始數據)

2008-2020年全國各省綠色金融發展指數(含原始數據) 1、時間:2008-2020年 2、范圍:30個省市 不含西藏 3、來源:原始數據整理自csmar、eps、wind等數據庫 4、原始數據指標: A股上市環保企業新增銀行貸款…

企業服務器數據庫遭到malox勒索病毒攻擊后如何解決,勒索病毒解密

網絡技術的發展不僅為企業帶來了更高的效率,還為企業帶來信息安全威脅,其中較為常見的就是勒索病毒攻擊。近期,我們公司收到很多企業的求助,企業的服務器數據庫遭到了malox勒索病毒攻擊,導致系統內部的許多重要數據被加…

HCIP VRRP技術

一、VRRP概述 VRRP(Virtual Router Pedundancy Protocol)虛擬路由器冗余協議,既能夠實現網關的備份,又能夠解決多個網關之間互相沖突的問題,從而提高網絡可靠性。 局域網中的用戶的終端通常采用配置一個默認網關的形…

【uniapp】 軟鍵盤彈出后fixed定位被頂上去問題

問題描述 當手機設計的導航欄為fixed定位上去時&#xff0c;輸入框獲取焦點就會把頂部自定義的導航欄頂到上面去&#xff0c;如下圖所示 解決辦法 輸入框設置 :adjust-position“false” <input type"text" :adjust-position"false" focus"i…

【Linux】多線程之單例模式

多線程之單例模式 什么是設計模式&#xff0c;都有哪些設計模式單例模式餓漢模式懶漢模式 什么是設計模式&#xff0c;都有哪些設計模式 設計模式就是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理…

AI繪畫 | 一文學會Midjourney繪畫,創作自己的AI作品(快速入門+參數介紹)

一、生成第一個AI圖片 首先&#xff0c;生成將中文描述詞翻譯成英文 然后在輸入端輸入&#xff1a;/imagine prompt:Bravely running boy in Q version, cute head portrait 最后&#xff0c;稍等一會即可輸出效果 說明&#xff1a; 下面的U1、U2、U3、U4代表的第一張、第二張…

Nacos AP架構集群搭建(Windows)

手寫SpringCloud項目地址&#xff0c;求個star github:https://github.com/huangjianguo2000/spring-cloud-lightweight gitee:https://gitee.com/huangjianguo2000/spring-cloud-lightweigh 目錄&#xff1a; 一&#xff1a;初始化MySQL 二&#xff1a;復制粘貼三份Nacos文…

分類預測 | MATLAB實現GAPSO-BP遺傳算法組合粒子群算法優化BP神經網絡多輸入分類預測

分類預測 | MATLAB實現GAPSO-BP遺傳算法組合粒子群算法優化BP神經網絡多輸入分類預測 目錄 分類預測 | MATLAB實現GAPSO-BP遺傳算法組合粒子群算法優化BP神經網絡多輸入分類預測預測效果基本介紹模型描述程序設計參考資料 預測效果 基本介紹 1.分類預測 | MATLAB實現GAPSO-BP遺…

YoloV8優化:通道優先卷積注意力,效果秒殺CBAM和SE等 | 即插即用系列

??????本文獨家改進:通道優先卷積注意力,采用多尺度結構來增強卷積運算捕獲空間關系的能力,解決CBAM 整合了通道注意和空間注意,但它在其輸出特征的所有通道上強制執行一致的空間注意分布。相反,SE只整合了通道注意,這限制了它選擇重要區域的能力 通道優先卷積注意…

LabVIEW使用圖像處理進行交通控制性能分析

LabVIEW使用圖像處理進行交通控制性能分析 采用普雷維特、拉普拉斯、索貝爾和任意的空間域方法對存儲的圖像進行邊緣檢測&#xff0c;并獲取實時圖像。然而&#xff0c;對四種不同空間域邊緣檢測方法的核的性能分析。 以前&#xff0c;空路圖像存儲在數據庫中&#xff0c;道路…