A regular expression (shortened as regex or regexp; sometimes referred to as rational expression) is a sequence of characters that specifies a search pattern in text.
正規表示式(英語:Regular expression,常簡寫為regex、regexp或RE),又稱規律表達式、正規表達式、正規表示法、規則運算式、常規表示法,是電腦科學概念,用簡單字串來描述、符合文中全部符合指定格式的字串
why : 做過濾或驗證(錯誤,攻擊) 規範或限制文字的格式 提高效率
what : 描述一種字串匹配的規則模式
手機號碼 : 09xx-xxx-xxx
nos = ["0933-123-456", "0833-123-456", "1933-123-456",
"0933-A123-45", "1234-567-890", "0933-123-45" ]
for no in nos:
no = no.replace('-','')
if len(no)==10 and no.isdecimal():
if no[0:2] == "09":
print(f"{no:>12} is ok")
continue
print(f"{no:>12} is not ok")
0933123456 is ok
0833123456 is not ok
1933123456 is not ok
0933A12345 is not ok
1234567890 is not ok
093312345 is not ok
身分證字號 : A123456789
ids = ["A123456789", "a123456789", "1234567890",
"AA12345678", "A1234567890", "AAA", "123"]
for id in ids:
if len(id)==10:
if id[0].isalpha() and id[0].isupper():
if id[1:].isdecimal():
print(f"{id:>12} is ok")
continue
print(f"{id:>12} is not ok")
A123456789 is ok
a123456789 is not ok
1234567890 is not ok
AA12345678 is not ok
A1234567890 is not ok
AAA is not ok
123 is not ok
民國日期 : 100 年 10 月 25 曰
特殊字元規則範例說明
[] | 括號內的任何字元 | [a-zA-Z0-9] | 大小寫字母或數字 |
[^] | 不在括號內的任何字元 | [^abc]+ | Anything but abc. |
. | 換行之外的單一字元 | . . | 中間有空白的兩個字 |
| | 表示所有可能的條件 | a|b | a or b , pick one! |
Anchor | 規則 | 範例 | 說明 |
---|---|---|---|
^ | 輸入的開頭 | ^aaa | 以aaa 開頭 |
$ | 輸入的結尾 | bbb$ | 以bbb 結尾 |
() | 小括弧內的字元形成群組 | (dog) | |
\ | 特殊符號 |
重複表示 | 規則 | 範例 | 說明 |
---|---|---|---|
? | 未出現或出現一次 | ba? | b後面沒有a或一個a |
* | 未出現或出現多次 | ba* | b後面沒有a或多個a |
+ | 出現一次或多次 | ba+ | b後面有一個以上的a |
重複表示 | 規則 | 範例 | 說明 |
---|---|---|---|
{m,n} | 最少出現 m 次, 最多出現 n 次 | a{3,6} | 3到6個a |
{n} | 出現 n 次 | a{3} | 剛好三個a |
{n,} | 至少出現 n 次以上 | a{3,} | 3個a以上 |
特別序列 | 說明 |
---|---|
\b | 單字的界線字元。 |
\B | 字元的界線字元。 |
\d | 數字,從 0 到 9 。 |
\D | 非數字。 |
\s | 各種空白符號,包含換行符號 \n 。 |
\S | 非空白符號。 |
\w | 任意文字字元,包括數字。 |
\W | 非文字字元,包括空白符號。 |
手機號碼 : 09xx-xxx-xxx
09 | xx | xxx | xxx |
---|---|---|---|
09 | 2digit | 3digit | 3digit |
09 | \d{2} | \d{3} | \d{3} |
身分證字號 : A123456789
part 1 | part 2 |
---|---|
A | 123456789 |
1 uppercase letter | 9 digit |
[A-Z] | \d{9} |
民國日期 : 100 年 10 月 25 曰
100 | 年 | 10 | 月 | 25 | 曰 |
---|---|---|---|---|---|
1-3 digit | 年 | 1-2 digit | 月 | 1-2 digit | 曰 |
\d{1,3} | 年 | \d{1,2} | 月 | \d{1,2} | 曰 |
民國日期 : 100 年 10 月 25 曰
\s*(\d{1,3})\s*年\s*(\d{1,2})\s*月\s*(\d{1,2})\s*
re: Document
匯入Re模組
import re
re.search() 方法 re.search(pattern, string, flags=0) https://docs.python.org/zh-tw/3/library/re.html#re.search
找到符合規則的,便會得到一個 Match 物件 如果沒有找到,則會得到 None
import re
no = "0933-123-456"
res = re.search(r"09\d{2}-\d{3}-\d{3}", no)
print( f"serach {no:13} return {type(res)} res is {res}" )
no = "0933-123-56"
res = re.search(r"09\d{2}-\d{3}-\d{3}", no)
print( f"serach {no:13} return {type(res)} res is {res}" )
serach 0933-123-456 return <class 're.Match'> res is <re.Match object; span=(0, 12), match='0933-123-456'>
serach 0933-123-56 return <class 'NoneType'> res is None
import re
no = "0933-123-456"
if re.search(r"09\d{2}-\d{3}-\d{3}", no):
print(f"{no} is ok")
else:
print("{no} is not a phone number")
0933-123-456 is ok
需要使用 group() 方法把找到的東西呈現出來
import re
no = "0933-123-456"
res = re.search(r"09\d{2}-\d{3}-\d{3}", "0933-123-456")
if res:
print( f"serach {res.group()}" )
serach 0933-123-456
import re
date = "100 年 10 月 25 曰"
res = re.search(r"\s*(\d{1,3})\s*年\s*(\d{1,2})\s*月\s*(\d{1,2})\s*曰", date)
if res:
print(f"res.group() {res.group()}")
print(f"res.group(0) {res.group(0)}")
print(f"res.group(1) {res.group(1)}")
print(f"res.group(2) {res.group(2)}")
print(f"res.group(3) {res.group(3)}")
res.group() 100 年 10 月 25 曰
res.group(0) 100 年 10 月 25 曰
res.group(1) 100
res.group(2) 10
res.group(3) 25
re.sub(pattern, repl, string, count=0, flags=0)
res = re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam', flags=re.IGNORECASE)
print(res)
res = re.sub(r'prize - \w+', 'xxxx', 'first prize - Phoebe, second prize - Vivi, third prize - Ming')
print(res)
Baked Beans & Spam
first xxxx, second xxxx, third xxxx