# 正則表達式
---
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'>
---
### 通用字元表示
----
符號 |       意義
----|-----
\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
----
符號 |       意義
----|-----
. | 配對除換行以外字元
^ | 配對字串開始位置
$ | 配對字串結束位置
----
範例4:限制邊界
pattern
```
"^abd"
"^abc"
"py$"
"ay$"
```
string
```
abcdwfijod_G2killSKTwTF_ajfioe_py
```
----
符號 |       意義
----|-----
\* | 配對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'>
----
符號 |       意義
----|-----
{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
----
符號 |       意義
----|-----
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 檔案暫存

----
- 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)

{"metaMigratedAt":"2023-06-15T01:22:18.316Z","metaMigratedFrom":"Content","title":"正則表達式","breaks":true,"contributors":"[{\"id\":\"246310b9-df49-4665-937f-59c2d79b7869\",\"add\":5858,\"del\":1041}]"}