處理文字的利器‑正規表達式(Regular Expression)

Chia Yin Chen
4 min readMar 5, 2020

--

正規表達式(Regular Expression, Regex or RegExp)簡單來說就是用一堆符號來表達對文字的一種過濾邏輯,但這堆符號又代表著什麼呢?

這篇文章想和大家分享一些自己在工作上,使用 python re模組 處理相對複雜情況時所使用的技巧。

首先先來認識常用的 4 種 RegExp 符號:

𝟷. 比對 [一個或多個字元] 的符號

[]: 符合在括號內的任何字元
[^]: 符合不在括號內的任何字元

𝟸. 具有 [定位] 功能的符號,不吃掉任何的字元

^: 開頭的字元
$: 結束的字元

𝟹. 比對 [出現次數] 的符號

{}: 比對文字出現的次數
x{3} 剛好 3 個 x
x{1,3} 1 到 3 個 x
x{1,} 至少 1 個 x
x{,3} 最多 3 個 x
*: 出現 0 次或多次,相當於 {0,}
+: 出現 1 次或多次,相當於 {1,}
?: 出現 0 次或 1 次,相當於 {0,1}

𝟺. 特殊字元

.: 可以用來表達任何字元
\: 可以用來跳脫特殊字元
\d: 任何數字字元,相當於 [0-9]
\D: 任何非數字字元,相當於 [^0-9]
\w: 任何數字字母底線,相當於 [A-Za-z0-9_]
\W: 任何非數字字母底線,相當於 [^A-Za-z0-9_]
\s: 任何空白字元(空白,換行,tab),相當於 [ \f\n\r\t\v]
\S: 任何非空白字元(空白,換行,tab),相當於 [^ \f\n\r\t\v]

當遇到以下情況時,有什麼快速又優雅的解法?

情況 1:替換時間位置

2/3/2020 15:05 (日/月/年 時:分) 替換成 2020–3–2 15:05 (年-月-日 時:分)

這時候單純用 python 中的 split、replace、join 函式來處理,就會挺麻煩的 …

我們可以透過 re.sub() 來解決這個問題:

>>> _time = '2/3/2020 15:05'
>>> re.sub(r'(\d{,2})/(\d{,2})/(\d{4}) (\d{,2}:\d{,2})', r'\g<3>-\g<2>-\g<1> \g<4>', _time)

📝 Note:字符串中的 \g<1>、\g<2> ... \g<n> 表示分組編號 1 - n,使用 \g<n> 的方式取得第 n 個分組匹配得到的值。

情況 2:文章網址翻頁

替換網址的翻頁參數,如 https://apk.tw/thread-932390–2-1.html 為第二頁,https://apk.tw/thread-932390–3-1.html 為第三頁,因此可得知文章的翻頁邏輯為 https://apk.tw/thread-932390-{page}-1.html

這時候一樣可以透過 re.sub() 方便快速解決問題:

>>> url = 'https://apk.tw/thread-932390-1-1.html'
>>> for page in range(1, 6):
next_page = re.sub(r'thread-(\d+)-(\d+)-', rf'thread-\g<1>-{page}-', url)
print(next_page)

正規表達式雖然是個很強大的工具,但對於非工程師的朋友來說,應該會覺得有點難上手,因此決定未來將寫一篇 使用快捷鍵對文字進行過濾 的文章和非工程師的朋友們分享,敬請期待 🥳

--

--