2018年4月28日筆記
- 正則表達式
- 數量詞的貪婪模式與非貪婪模式
Python中數量詞默認是貪婪的,總是嘗試匹配盡可能多的字符
例如,正則表達式 "ab*" 如果用於查找 "abbbc",將匹配到 "abbb";如果是非貪婪方式,則會匹配到 "a"
註意:
+或*後跟?表示非貪婪匹配,即盡可能少的匹配
.*? 表示匹配任意數量的重復,但是在能使整個匹配成功的前提下使用最少的重復
如:a.*?b匹配最短的,以a開始,以b結束的字符串。如果把它應用於aabab的話,它會匹配aab和ab
- re 模塊
Python通過re模塊提供對正則表達式的支持.
使用re的一般步驟是先將正則表達式的字符串形式編譯為Pattern實例,然後使用Pattern實例處理文本並獲得匹配結果(一個Match實例),最後使用Match實例獲得信息,進行其他的操作
re模塊常用的方法有:re.compile() re.match() re.search() re.findall re.split() re.group()
- re.compile()
compile()函數用於編譯正則表達式,生成一個正則表達式(Pattern)對象,供match()和search()這兩個函數使用
語法格式為:
re.compile(pattern [, flags])
參數:
patten :一個字符串形式的正則表達式
flags :可選,表示匹配模式,具體有以下6中模式
- re.I 忽略大小寫
- re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴於當前環境
- re.M 多行模式
- re.S 即為. 並且包括換行符在內的任意字符(. 不包括換行符)
- re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴於 Unicode 字符屬性數據庫
- re.X 為了增加可讀性,忽略空格和 # 後面的註釋
1 import re 2 3 pattern = re.compile(r"\d+") # 用於匹配至少一個數字 4 # 沒匹配到返回None,否則返回一個Match對象 5 r1 = pattern.match("one12twothree34four") 6 print(r1) 7 8 r2 = pattern.match("one12twothree34four", 2, 10) 9 print(r2) 10 11 r3 = pattern.match("one12twothree34four", 3, 10) 12 print(r3) 13 print(type(r3)) 14 15 print("\n") 16 print(r3.group()) # group()方法用於獲得獲得整個匹配的子串 17 print(r3.start()) # start()獲取匹配字串在整個字符串中的起始位置(子串第一個字符的索引) 18 print(r3.end()) # end()獲取匹配字串在整個字符串中的結束位置(子串最後一個字符的索引+1) 19 print(r3.span()) # span()方法返回 (start(group), end(group))
None None <_sre.SRE_Match object; span=(3, 5), match=‘12‘> <class ‘_sre.SRE_Match‘> 12 3 5 (3, 5)
- re.match()
re.match 只從字符串的起始位置匹配一個模式
匹配成功re.match方法返回一個匹配的對象,否則返回None
使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式
1 import re 2 3 string = "You are beautiful yeah hahaha!" 4 pattern = r"(.*) are (.*?) (.*)" 5 m = re.match(pattern, string) 6 7 if m: 8 print("matchObj.group(): {0}".format(m.group())) 9 print("matchObj.group(1): {0}".format(m.group(1))) 10 print("matchObj.group(2): {0}".format(m.group(2))) 11 print("matchObj.group(3): {0}".format(m.group(3))) 12 else: 13 print("No match !") 14 15 print("matchObj.groups: {0}".format(m.groups()))
matchObj.group(): You are beautiful yeah hahaha! matchObj.group(1): You matchObj.group(2): beautiful matchObj.group(3): yeah hahaha! matchObj.groups: (‘You‘, ‘beautiful‘, ‘yeah hahaha!‘)
- re.search()
re.search() 掃描整個字符串並返回第一個成功的匹配
1 import re 2 3 print(re.search("here", "here you are").span()) 4 print(re.search("here", "you are here").span())
(0, 4)
(8, 12)
- re.match() 與 re.search() 的區別
re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配
- re.findall()
在字符串中找到正則表達式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表
註意: match() 和 search() 只匹配1次;而 findall() 會匹配所有
1 import re 2 3 pattern = re.compile(r"\d+") 4 string = "1one2two3three4four" 5 6 r1 = pattern.findall(string) 7 r2 = pattern.findall(string, 5, 15) 8 9 print(r1) 10 print(r2)
[‘1‘, ‘2‘, ‘3‘, ‘4‘] [‘3‘, ‘4‘]
- re.split()
split()方法按照能夠匹配的子串將字符串分割後返回列表
1 import re 2 3 string = "1one# 2two# 3three# 4four# 5#" 4 print(re.split(" ", string)) # 按空格切 5 print(re.split("#", string)) # 按"#"切
[‘1one#‘, ‘2two#‘, ‘3three#‘, ‘4four#‘, ‘5#‘] [‘1one‘, ‘ 2two‘, ‘ 3three‘, ‘ 4four‘, ‘ 5‘, ‘‘]
- re.sub()
re.sub()用於替換字符串中的匹配項
1 import re 2 3 phone = "2004-959-559 # 這是一個國際號碼" 4 5 # 刪除字符串中的註釋 6 r1 = re.sub(r"#.*$", "", phone) 7 print(r1) 8 9 # 刪除非數字的字符串 10 r2 = re.sub("\D", "", phone) 11 print(r2)
2004-959-559 2004959559
2018年4月28日筆記