跳到主要內容

Python筆記(13)-正規表達式

正規表達式是程式設計中一個強大的工具,可以針對大量且複雜的文本進行分析,可以利用模式匹配的方式找出目標字串並針對目標字串進行文本處理,可以大大提高文本分析的效率與準確性。Python 程式語言要使用正規表達式相關函數必須使用re模組,所以使用前必須引進re模組。

13.1 re模組

使用re模組找尋特定字串有兩個步驟,1. 定義匹配模式(即建立正規表達式物件); 2. 使用搜尋函數尋找特定模式的字串,我們將其整理在如下表格:

我們舉幾個例子說明如下:

這裡說明一下<re.Match object; span=(0, 1), match='a'>的意思,這個是一個MatchObject,其中span=(0,1)代表在第0的位置開始成功配對直到第1個位置配對失敗,march=’a’則表示配對到的字串為’a’。只有match與search在配對成功才會出現以上訊息,如果配對失敗則會出現None。Findall函數不管有無配對成功皆會輸出list,配對成功會將所有配對成功的字串以list輸出,如果配對失敗,則會輸出空的list。

13.2 正規表達式的特殊字元(1) - .

. 代表一個非換列字元(\n)以外的所有字元。範例如下:


13.3 正規表達式的特殊字元(2) - *

* 代表前一個項目可以出現0~無限多次。範例如下:

13.4 正規表達式的特殊字元(3) - +

+ 代表前一個項目可以出現1~無限多次。範例如下:

13.5 正規表達式的特殊字元(4) - ?

? 代表前一個項目可以出現0~1次。範例如下:

13.6 正規表達式的特殊字元(5) - ^, $

^ 表示開頭 ; $ 表示結尾。範例如下:

13.7 正規表達式的特殊字元(6) - {}

{m,n} 表示前一個項目最少出現m次,最多出現n次。

{m,} 表示前一個項目最少出現m次。

{,n} 表示前一個項目最多出現n次。

{m}表示前一個項目出現m次。

範例如下:

13.8 正規表達式的特殊字元(7) – []

[] 表示用來匹配[]內的字元。範例如下:

13.9 正規表達式的特殊字元(8) – \

\ 表示\後的字元用以一般字元處理。範例如下:

這裡說明一下,正規表示式中的+是一個特殊字元,它代表前一個項目出現1次以上,但現在想要把它單純視為一般字元的+號,就需要前面加一個\符號,讓其轉換成一般字元處理。

13.10 正規表達式的特殊字元(9) – []中的^

[]中的^ 表示反運算,表示找配對了[]中的字元以外的字元。範例如下:

這裡說明一下,這裡的正規表示式為[^\.," ]+,他表示要找尋除了”.” , “,” , ””” ,空白這些字元以外的字元。

13.11 基礎範例-判定合格的mail格式

我們建立合格與不合格的mail格式範例,設計一個合格的mail格式的配匹模式,其模式如下:[A-Za-z0-9]+[\._]?[A-Za-z0-9]*@([A-Za-z0-9]+\.)+[A-Za-z0-9]

我們拆解部分內容說明如下:

[A-Za-z0-9]+ : 表示英文字母與數字組成的字詞。

[\._]? : 表示符號.或_只能出現0次或1次。

[A-Za-z0-9]+[\._]? [A-Za-z0-9]*:表示類似hello_123或Hello.123或abc_123_ABC等類似模式。

([A-Za-z0-9]+\.)+[A-Za-z0-9]:表示gmail.com.tw等類似模式。

以下我們提供程式範例與輸出結果。

這裡提供合格與不合格的mail範例如下:

VaildMailList=['example@example.com','john.doe@example.com.tw','jane_doe@example.co.uk','info123@example.net','john_doe123@example.org']

InvaildMailList=['example.com','john.doe@example','jane_doe@example@com','info123@example.','john-doe123@example_com']

13.11 其它的正規表達式的特殊字元

* \d與[0-9]同義。

* \D與[^0-9]同義。

* \t 表示Tab字元定位。

* \n 表示換行字元。

* | 可以用來比對多個正規表達式。

13.12 使用正規表達式進行模式配對的另一種方法

前面我們講過,使用re模組找尋特定字串有兩個步驟,1.定義匹配模式(即建立正規表達式物件); 2. 使用搜尋函數尋找特定模式的字串,re模組提供了另一種方式可以直接將兩個步驟直接結合再一起,我們使用表格整理如下:

此種方法與之前方法的差異就是多了一個flags參數可以設定,flags參數的設定可使匹配過程更彈性,設定方式可參考以下網站: https://pynative.com/python-regex-flags/

13.13 針對匹配的字串進行替換

re模組提供了一個可以針對匹配的字串進行替換的函數re.sub(),細節說明如下:



13.14 進階範例-從HTML中擷取資訊

我們給定一個HTML,內有每個商品的網址連結、圖片連結、商品金額、連絡電話等資訊,我們建立每個項目的匹配模式,將每個資訊擷取出來並表格化。

HTML代碼如下:

<html>

<head>

  <title>商品詳細資訊</title>

</head>

<body>

  <h1>商品詳細資訊</h1>

  <h2>商品1</h2>

  <h3>網址</h3>

  <p><a href="https://www.example.com/product1">https://www.example.com/product1</a></p>

  <h3>金額</h3>

  <p>$50</p>

  <h3>圖片網址</h3>

  <img src="https://www.example.com/images/product1.jpg" alt="商品1圖片">

  <h3>電話</h3>

  <p>123-456-7890</p>

 

  <h2>商品2</h2>

  <h3>網址</h3>

  <p><a href="https://www.example.com/product2">https://www.example.com/product2</a></p>

  <h3>金額</h3>

  <p>$100</p>

  <h3>圖片網址</h3>

  <img src="https://www.example.com/images/product2.jpg" alt="商品2圖片">

  <h3>電話</h3>

  <p>987-654-3210</p>

  <h2>商品3</h2>

  <h3>網址</h3>

  <p><a href="https://www.example.com/product3">https://www.example.com/product3</a></p>

  <h3>金額</h3>

  <p>$75</p>

  <h3>圖片網址</h3>

  <img src="https://www.example.com/images/product3.jpg" alt="商品3圖片">

  <h3>電話</h3>

  <p>456-123-7890</p>

  <h2>商品4</h2>

  <h3>網址</h3>

  <p><a href="https://www.example.com/product4">https://www.example.com/product4</a></p>

  <h3>金額</h3>

  <p>$200</p>

  <h3>圖片網址</h3>

  <img src="https://www.example.com/images/product4.jpg" alt="商品4圖片">

  <h3>電話</h3>

  <p>987-123-4560</p>

  <h2>商品5</h2>

  <h3>網址</h3>

  <p><a href="https://www.example.com/product5">https://www.example.com/product5</a></p>

  <h3>金額</h3>

  <p>$120</p>

  <h3>圖片網址</h3>

  <img src="https://www.example.com/images/product5.jpg" alt="商品5圖片">

  <h3>電話</h3>

  <p>789-456-1230</p>

</body>

</html>

輸出結果如下:

留言

這個網誌中的熱門文章

RPA-Uipath筆記(1) - 如何從網路上下載資料並存至指定路徑

最近在做 RPA 相關專案時遇到了這個問題: 如何從網路上下載資料並存至指定路徑? 針對這個問題我們採取的解決方案是 先讓檔案下載到電腦的預設路徑,再將檔案移動到我們指定的資料夾 。 以下我們用下載政府公開資料平台的資料 ("https://data.gov.tw/dataset/116285") 為例, Uipath 的流程建立如下: 使用到了 Wait for Download 、 Move File 、 Delete File 三個 Activity , Wait for Download 中 Monitored folder 必須放瀏覽器中設定的下載檔案的預設路徑且關閉詢問儲存位置。 Downloaded file 則是設定一個變數名稱 downloadfile( 可自訂 ) ,此變數的資料型態是 FileInfo 。中間則放入下載的流程步驟,從下載開始到結束都會在此 Activity 中執行完畢,執行完後所下載的檔案的相關資訊都會被存放在變數 downloadfile 中。 接下來是將檔案從預設下載路徑中移至指定路徑,這裡就需要下載預設路徑與指定路徑,這兩個我們在流程一開始就建了了兩個變數 dnlo_path 、 asng_path ,寫法如下: dnlo_path = "C:\Users\" +system.Environment.UserName+ "\Downloads" system.Environment.UserName à VB 語法,代表目前電腦的使用者名稱。 asng_path = "D:\Bolg 資料 \Uipath\Uipath(1)" Move File Activity 中 From 要放入目前檔案的位置; To 則要放入檔案存放的指定的位置,但因為是要做檔案的移動,所以以上兩個路徑後面都要再加上檔案名稱,這時可以使用 downloadfile 這個變數的屬性值叫出檔案名稱( downloadfile.Name ),當檔案名稱是隨機變動的時候,非常好用。另外,特別值得注意的是, To 的部分在加上檔案名稱時,可以不用用原始檔案的名稱,這時可以同時達到修改檔名的效果。 Overwrite 的部分打勾代表再重複執行一次的時...

RPA-Uipath(5)-如何讀取Mail與取得Mail的資訊

本篇主要介紹 Uipath 取得 mail 相關資訊與附件的方法,因為 mail 的種類眾多,本範例以 Gmail 為例。首先在使用 Uipath 取得 Gmail 相關資訊前須對 Google 帳戶的安全性進行兩階段驗證設定,設定方式如下: Step1. 點選 ” 管理你的 Google 帳戶 ” Step2.  點選 ” 安全性 ” à ” 兩階段驗證 ” à 點選 ” 開始使用 ” Step3.  依 Google 所提示步驟,您最後會取得一組密碼,請務必將此密碼記下。 接下來要開始使用 Uipath 擷取 mail 相關資訊,一開始我們先使用 Get Password 儲存 mail 登入的密碼,此時密碼不是使用您真正的密碼而是使用剛剛兩階段驗證後取得的密碼,並儲存於變數 password 。 接下來使用 Get IMAP Mail Messages 來取得 mail 的相關資訊,在使用 Get IMAP Mail Messages 時必須在其屬性設定區塊進行一些參數設定。 Port 欄位填入 993 , Server 欄位填入 "imap.gmail.com" , Email 欄位填入您的 Email , Password 欄位填入 變數 password , Message 欄位我們用 MailMessage 變數填入 Mail 的相關資訊都會存在 MailMessage 變數中,我們可以用 For Each 迴圈逐一取得 mail 的相關資訊。 For Each 的屬性區塊部分也需要進行一些參數設定, List of item 欄位需填入 MailMessage 變數, TypeArgument 則須設定為 System.Net.Mail.MailMessage 。 設定完成後,我們先用 Write Line 將信件的主旨印出做為測試( 這邊我們只印出前 5 封信件的主旨,可在 Get IMAP Mail Messages 的屬性區塊中 Top 欄位中設定 ),如果要印出信件主旨,需要用 item.Subject 屬性,如要印出其他資訊,我們將常用的幾個列在以下表格: 最後,有些信件會附帶一些附件,我們如何將這些物件儲存下來呢 ? 這邊只需要用到 Save Attachments 即可。我們將其放在迴圈內以下載每個有附件的 mail...

RPA-Uipath(6)-如何讀取檔案的相關日期與時間

這一篇我們主要要說明如何批次將檔案的 ” 建立時間 ” 、 ” 修改時間 ” 、 ” 存取時間 ” 擷取出來,並整理匯出一個 Excel 表格。 在說明之前,我們簡單說明一下我們要擷取的是那些時間,我們可以針對任一個檔案,按下右鍵,選取內容,就會跳出該檔案的相關資訊,其中就有所謂的 ” 建立時間 ” 、 ” 修改時間 ” 、 ” 存取時間 ” ,如下圖所示,我們的目的就是將這些時間一一擷取出來。 要擷取以上的這些時間,需要用到 FileInfo() 物件,用法如下: 1.      建立時間: new FileInfo( 檔案路徑 ).CraeationTime.ToString( 日期時間格式 ) 2.      最後修改時間: new FileInfo( 檔案路徑 ).LastWriteTime.ToString( 日期時間格式 ) 3.      最後存取時間: new FileInfo( 檔案路徑 ).LastAccessTime.ToString( 日期時間格式 ) 因為我們的範例要批次讀取一個資料夾中多個檔案,所以會用到 Directory.GetFiles( 資料夾路徑 ) ,此函數會回傳資料夾中所有檔案的路徑並以 List 型態儲存。 以下我們說明我們如何用 Uipath 達到此目的: 我們一開始先用 FilePathList 變數儲存資料夾中所有檔案的路徑,建立一個空的 DataTable ,其中我們建立了四個欄位 ”FileName” 、 ”CreationTime” 、 "LastModifiedTime" 、 ”LastAccessTime” 。 接下來,利用 For Each 對每一個檔案,擷取以上四個資訊並分別用四個變數儲存 FileName 、 FileCreationTime 、 FileLastModifiedTime 、 FileLastAccessTime 並將次四個資訊放入 DataTable 中 ( 利用 Add Data Row 的 Activity) 。 For Each 結束後,我們將 DataTable 寫入 Excel 中並存於同一個資料夾,如下圖所示。