Python正規表達式

Yanwei Liu
6 min readDec 30, 2018

--

常用規則

#中文
[\u4e00-\u9fa5]
#數字
[0-9]*$
英文和數字
[A-Za-z0-9]+$ 或 [A-Za-z0-9]{4,40}$
#網址URL
[a-zA-z]+://[^\s]*
#年月日期格式
([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))
#Email
r'[\w.-]+@[^@\s]+\.[a-zA-Z]{2,10}$'
#台灣手機
r'(?:0|886-?)9\d{2}-?\d{6}'
#台灣電話
0[2-8-]+[0-7]+[0-9]
#抓HTML標籤內的文字
>([\w\s()]*?)</a>
#抓HTML標籤中的連結(以wiki為例子)
\/wiki\/[\w-]*
https://en.wikipedia.org/wiki/Unsupervised_learning

符號說明

*:前面的字元可出現零次以上
+:前面的字元至少要出現一次以上
{m,n}:前面的字元可出現m次~n次(包含)
[0-9]:0~9之間的任意數字
[a-z]:a~z之間的任意文字(小寫)
[A-Z]:A~Z之間的任意文字(大寫)
.:代表任何字元(符號、數字、空格)
\:跳脫字元 例如:\+(尋找+號)
|:代表"或"(符合其中一個即可)
\w:代表任何字母或數字,等同於[a-z A-Z 0-9]
\d:代表匹配十進位數字,即[0-9]

引入模組

import re

開始配對 (match方法)

content = 'Hello 123 4567 World_This is a Regex Demo'
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}', content)
#由上例可觀察到,使用公式為
re.match('規則',內容變數)
#match方法是從開頭開始匹配的,一旦開頭不同就會失敗

列出符合規則的字串 (group方法)

print(result.group())   #group方法可以輸出所有匹配的內容
print(result.group(1)) #group(1)輸出第1個匹配的內容,也可輸出第2、第3
print(result.span()) #span方法輸出匹配的範圍

【盡量使用】搜尋字串,傳回「第一個」符合的內容 (search方法)

#回傳None(因為match從開頭進行比對)
import re
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'result = re.match('Hello.*?(\d+).*?Demo', content)print(result)#回傳出數值(使用search方法,整串搜尋)
import re
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'result = re.search('Hello.*?(\d+).*?Demo', content)print(result)

搜尋字串,傳回「所有」符合的內容 (findall方法)

import recontent = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'result = re.findall('Hello.*?(\d+).*?Demo', content)print(result)

去除或取代字串中的內容(例如:數字或指定類型的文字)(sub方法)

import recontent = '54aK54yr5oiR54ix5L2g'content = re.sub('\d+', '', content) 
#第一個參數是要取代的,第二個參數是想變成的
#第二個參數若為空,則可以變成取代功能
#第三個參數為原本的字串
print(content)#印出的結果無任何數字存在

將想過濾的「表達式」變成一表達規則(compile方法)

import recontent1 = '2016-12-15 12:00'content2 = '2016-12-17 12:55'content3 = '2016-12-22 13:21'pattern = re.compile('\d{2}:\d{2}')   #將想過濾的「表達式」變成一表達規則result1 = re.sub(pattern, '', content1)result2 = re.sub(pattern, '', content2)result3 = re.sub(pattern, '', content3)print(result1, result2, result3)#本例子透過compile先建立一個規則,再透過sub來取代字串

用指定字串來進行分割(split方法)

import recontent='one1two2three3four4'pattern = re.compile(r'\d+')print(re.split(pattern,content))### 輸出 #### ['one', 'two', 'three', 'four', '']

--

--