1. 程式人生 > >2018年4月28日筆記

2018年4月28日筆記

you 替換 其他 pytho HERE art group 結果 圖片

  • 正則表達式

技術分享圖片

  • 數量詞的貪婪模式與非貪婪模式

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中模式

    1. re.I  忽略大小寫
    2. re.L  表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴於當前環境
    3. re.M  多行模式
    4. re.S  即為. 並且包括換行符在內的任意字符(. 不包括換行符)
    5. re.U  表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴於 Unicode 字符屬性數據庫
    6. 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日筆記