正規表達式是程式設計中一個強大的工具,可以針對大量且複雜的文本進行分析,可以利用模式匹配的方式找出目標字串並針對目標字串進行文本處理,可以大大提高文本分析的效率與準確性。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>
輸出結果如下:
留言
張貼留言