re 套件
用方便的re模組來使用正則表達式。
方法 | 說明 |
---|---|
match(string) | 由字串開頭開始匹配正則表達式的字串,值道找不到字元為止,如果要尋找的字串在中間或在尾端則找不到並傳回None,找到時並把結果存入MatchObject中。 |
search(string) | 傳回第一個尋找到的正則表達式字串,並把結果存入 MatchObject中 ,若無符合則傳回None。 |
findall() | 找到字串中所有符合正則表達條件的字串,並存成字串傳回,若無符合則傳回一個空的串列。 |
sub() | 可以用新的字串取代搜尋的字串,並回傳取代後的字串,而原本的字串保持不變,輸入”count=次數”則可以選擇替換掉的次數。 |
import re
a = re.search(r"[0-9]+", "abc123cba321aaa789cccp9a1")
#使用正規表達式前面須加個r,防止脫逸字元被轉譯
print(a)
#<re.Match object; span=(3, 6), match='123'>
b = re.match(r"[0-9]+", "abc123cba321aaa789cccp9a1")
print(b)
#None,由於數字字元從中間開始所以無法匹配
c = re.findall(r"[0-9]+", "abc123cba321aaa789cccp9a1")
print(c)
#['123', '321', '789', '9', '1']
str_d = "abc123cba321aaa789cccp9a1"
d = re.sub(r"[0-9]+", "NUM", str_d, count=0)
#搜尋數字並以英文NUM取代,預設為0代表全部取代
print(d) #回傳被取代的字串,原始字串保留不變
#abcNUMcbaNUMaaaNUMcccpNUMaNUM
print(str_d) #原始字串保留不變
#abc123cba321aaa789cccp9a1
#sub和subn差別在於subn會回傳取代次數
MatchObject物件可用下面方法取得結果
方法 | 說明 |
---|---|
group() | 傳回符合正則表達式的字串,若無符合則傳回None,在r”()()()”裡以括號來分組別,如要對分組加上名子可使用r”?P<>,各個分組必須是連續(字串連續)的,也就是說如果中間有一個分組找不到或無法接續上個組別的尾和下個組別的頭則會出錯 |
groups() | 傳回符合正則表達式的各個分組字串,並以元組傳回 |
groupdict() | 如果幫組別加上名子(?P<name>),則會以字典形式{“名子”:”正則字串結果”}回傳 |
start() | 傳回match的開始位置 |
end() | 傳回match的結束位置 |
span() | 傳回(開始位置, 結束位置)的元組 |
import re
a2 = re.search(r"(?P<no1>1.3)(c.*3)(2.*7)", "abc123cba321aaa789cccp9a1")
#上個分組的尾必須接下個分組的頭
print(a2.group()) #總共有四個群組,第0組是全部,接著排序1、2、3,默認是第0群組(123cba321aaa7)
print(a2.group(2)) #cba3,如果群組有名子則也可輸入名子來獲取
print(a2.groups()) #('123', 'cba3', '21aaa7'),groups則會用各個group並以元組型態回傳
print(a2.groupdict()) #如果幫組別加上名子(?P<name>),則會以字典形式{"名子":"正則字串"}回傳
print(a2.start(1)) #默認是整個字串,也可輸入分組的索引
print(a2.end(3)) #默認是整個字串,也可輸入分組的索引
print(a2.span()) #默認是整個字串,也可輸入分組的索引
課堂小筆記
import re
emails = re.findall(r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA_Z0-9-.]+", html1)
print("全部的email:", emails)
for email in emails:
print("逐個email:", email)
price = re.findall(r"[\d]+元", html1)[0].split("元")[0]
#找到前面數字加上元的組合,再用分割split去掉"元"
price1 = re.sub(r"[\d]+元", "999元", html1)
#修改價格
print(price)
print(price1)
imglink = re.findall(r"https?://+[a-zA-Z0-9-/._]+.[jpegpng]+", html1)
for img in imglink:
print(img)