Python正規表達式
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 recontent = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'result = re.match('Hello.*?(\d+).*?Demo', content)print(result)#回傳出數值(使用search方法,整串搜尋)
import recontent = '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', '']