# 正則表達式 --- sli.do \#E503 --- ## 簡介 --- ### 正則表達式(Regular Expression) 又稱正規表達式、正規表示法、規則運算式、常規表示法,是電腦科學的一個概念。正規表示式使用單個字串來描述、匹配一系列符合某個句法規則的字串。 --- by 維基百科 --- 用一個特別的字串A ("ap{1,2}\w?e") 與另一個字串B("eatapplehappy")做配對,找出B符合A條件的部分 apple --- 那就先打開你們的Colab吧! --- ### RE 套件 ---- re.compile() re.match() re.search() re.findall() re.split() re.sub() ---- re.compile() re.match() re.search() \> **re.findall()** < re.split() re.sub() ---- 引入 re 套件 ```python import re ``` ---- - re.findall 用途:找到匹配的字串並回傳那個字串 ---- 用法 - pattern 正則表達式 - string 要配對的字串 - flag 其他規則(可不加) ```python re.findall(pattern, string, flag) ``` ---- 範例1:找到符合"abc"的部分 ``` qwerabcapple ``` ---- 範例程式碼 ```python import re string = "qwerabcapple" pattern = "abc" result = re.findall(pattern, string) print(result) ``` 結果:['abc'] ---- 練習1:找到非印列字元 ``` Ipressenter toswitchthisline ``` 提示:換行"\n" ---- 然後我們將練習1稍微改一下,再看他會印出什麼 ``` Ipressentertoswitchthisline ``` ---- 下一個套件 re.compile() re.match() \> **re.search()** < re.findall() re.split() re.sub() ---- 沿用範例1,改成用re.search() ```python import re string = "qwerabcapple" pattern = "abc" result = re.search(pattern, string) print(result) ``` <_sre.SRE_Match object; span=(4, 7), match='abc'> --- ### 通用字元表示 ---- 符號 | &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;意義 ----|----- \w | 配對任一字母、數字或底線字元 \W | 配對任一字母、數字或底線以外字元 \d | 配對任意十進制數字 \D | 配對任意十進制數字以外的字元 \s | 配對任一空白字元 \S | 配對任一空白字元以外字元 ---- 假設我們輸入 \w\dpython\w 對 python 做配對, 87python4、a4python_ 都可以配對成功 ---- 範例2 看看這兩組會配對出什麼 ``` "\w\dpython\w" "\spython\d\s" ``` ``` javascriptcsshtml5python_and python2 isgoingtoGG ``` --- ### 元素表 ---- 以\[]自訂範圍作配對 ``` "abc[xyz]" "abc[^xyz]" ``` ---- 範例3 - 比較 ``` "\wpython[xyz]\w" "\wpython[^xyz]\w" ``` ``` dafuiwefjpepythonx3hello ``` --- ### Metacharacter ---- 符號 | &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;意義 ----|----- . | 配對除換行以外字元 ^ | 配對字串開始位置 $ | 配對字串結束位置 ---- 範例4:限制邊界 pattern ``` "^abd" "^abc" "py$" "ay$" ``` string ``` abcdwfijod_G2killSKTwTF_ajfioe_py ``` ---- 符號 | &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;意義 ----|----- \* | 配對0次、1次或多次前面字元 ? | 配對0次或1次前面字元 \+ | 配對1次或多次前面字元 ---- 範例5:限定符號 pattern ``` "ye*a" "ye?a" "hex?ard" "ye+a" "hex+ard" ``` string ``` whenThesongplay_weheardyeeeea ``` ---- 貪婪模式 pattern = "p.*y" ``` giepgpython598fes_py ``` <_sre.SRE_Match object; span=(3, 20), match='pgpython598fes_py'> ---- 懶惰模式 pattern = "p.*?y" ``` giepgpython598fes_py ``` <_sre.SRE_Match object; span=(3, 7), match='pgpy'> ---- 符號 | &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;意義 ----|----- {n} | 前面字元剛好出現n次 {n,} | 前面字元至少出現n次 {n,m} | 前面字元至少出現n次,至多出現m次 \| | 選擇性配對 () | 自訂模板 ---- 範例6 ``` "la{2}" "la{2,}" "la{2,4}" ``` ``` themonkey_pickabanana_itplaaaaayhard ``` ---- 範例7 "python|php" ``` hguierjgngphp_sdfireg ``` ---- 範例8 "(bug){1,}" ``` therearebugbugbugbugbug_everywhere ``` --- ### Flag ---- 符號 | &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;意義 ----|----- I | 忽略大小寫 M | 多行配對 S | 讓.可以配對換行符號 ---- 範例9 ```python pattern = "python" result1 = re.search(pattern, string) result2 = re.search(pattern, string, re.I) ``` ``` caqyqjkgqmoxlybPythoneaytlriruzitinj ``` ---- 練習2 請用 "python" 這個 pattern 去跟下面字串配出組合為 python 的部分 ``` pgxunpxvsmebtbnbsxyasxdalpr ozclilxswzwkuexvhnxncglnbmzmyi pyfxbylvetnghzvryocm cafnuahzbyiPyThonsllqghzfnyts wnrltgantjbjzdcbhkruapuwkychoi dsdqbszvzibojemxmzsdbqgu ``` ---- 練習2-1 請找到以"python"為該行開頭的部分 ``` pgxunpxvsmebtbnbsxyasxdalpr ozclilxswzwpythonvhnxncglnbmzmyi pythonlvetnghzvryocm cafnuahzbyiPyThonsllqghzfnyts ``` <_sre.SRE_Match object; span=(61, 67), match='python'> --- ### 其他配對技巧 ---- 1. 使用 compile() 對 pattern 事先進行編譯 2. 再利用 findall() 找出所有符合 pattern 樣式的字串 ``` pattern = re.compile("abc") result = pattern.findall(string) ``` ---- 範例10 從下面找出所有 pattern 符合 ".python." 樣式的字串 ``` owpythonbkzidntpythonlsudmdevxlgdabfpythonjccgfl ``` ---- - re.sub() ```python re.sub(pattern, repeat, string, max) ``` ---- 練習3 使用re.sub()函式將python替換成Java - 替換全部 - 替換最多2次 ``` izkzwcrpythonjtraksltpvwupythonyqpdxphorphrpythonea ``` --- ### 應用 ---- colab 檔案暫存 ![](https://i.imgur.com/hnEnYwu.png) ---- - python讀檔 ```python f = open("file_name.txt", "r") string = f.read() ``` ---- 檔案 https://drive.google.com/drive/folders/1MG0nJWs-EFQhrlSPUd8t6YISfPW6kc4z ---- 練習4 找出文件(Reg_http_find.txt)裡面的"網址" ---- - 電子郵件地址命名規則 構造 ``` [域內部分]@[域名] ``` ---- 域內部分: 1. 數字0~9 2. 字母a~z、A~Z 3. 符號!#$%&'*+-/=?^_\`{|}~ 4. 最大長度64 ---- 域名: 1. 數字0~9 2. 字母a~z、A~Z 3. '-',不能出現在句尾 4. 最大長度255 ---- - 範圍 域內:a~z、A~Z、0~9、+、-、_、. 域名:a~z、A~Z、0~9、-、. ---- 練習5 找出文件(Reg_URL_find.txt)的"電子郵件地址" --- [回饋表單](https://docs.google.com/forms/d/e/1FAIpQLSfX4AvGNMdfrcB2gXvsEH4orPkDglOi_oZZXu0eSBHG2xUw5w/viewform) ![](https://i.imgur.com/mIgbp9h.png =450x)
{"metaMigratedAt":"2023-06-15T01:22:18.316Z","metaMigratedFrom":"Content","title":"正則表達式","breaks":true,"contributors":"[{\"id\":\"246310b9-df49-4665-937f-59c2d79b7869\",\"add\":5858,\"del\":1041}]"}
    777 views