---
# System prepended metadata

title: Regular Expression
tags: [Unix-like, ' Python']

---

---
tags: Unix-like, Python
---
# Regular Expression

使用正規表示法時，需要特別留意當時環境語系為何，否則可能會發生不相同的擷取結果。

> 使用 grep 或其他工具進行正規表示法的字串比對時，因為編碼的問題會有不同的狀態，因此可利用特殊符號如 `[:upper:]` 來替代編碼範圍如 `[A-Z]` 佳。
> 
> ```
> LANG=C     時：0 1 2 3 4 ... A B C D ... Z a b c d ...z
> LANG=zh_TW 時：0 1 2 3 4 ... a A b B c C d D ... z Z
> ```
> [name=[語系對正規表示法的影響 / 鳥哥的 Linux 私房菜](http://linux.vbird.org/linux_basic/0330regularex.php#lang)]

所以採用特殊符號會更加明確：

| 特殊符號     | 代表意義 |
|-------------|---------|
| `[:alnum:]` | 英文大小寫字元及數字，亦即 0-9, A-Z, a-z |
| `[:alpha:]` | 任何英文大小寫字元，亦即 A-Z, a-z |
| `[:digit:]` | 數字而已，亦即 0-9 |
| `[:lower:]` | 小寫字元，亦即 a-z |
| `[:upper:]` | 大寫字元，亦即 A-Z |
| `[:punct:]` | 標點符號 (punctuation symbol)，亦即：" ' ? ! ; : # $... |

| RE 字符 | 代表意義 |
|--------|---------|
| `^`    | `[^list]` 代表反向選擇，`^word` 代表定位在行首 |
| `$`    | 行尾 |
| `.`    | 一定有一個任意字元 |
| `*`    | 重複前一個字元，0 到無窮多次 |
| `+`    | 重複前一個字元，一個或一個以上 |
| `?`    | 重複前一個字元，零個或一個 |
| `\{n,m\}` | 連續 n 到 m 個的前一個 RE 字符 |
| `|`    | or |
| `()`   | 群組 |

 - `?P<group_name>regex`

## 參考資料

 - [RegexOne](https://regexone.com/)