發布時間: 2018-09-01 18:42:51
8.1 實驗介紹
8.1.1 關于本實驗
本實驗主要介紹了 Python 正則表達式的相關知識點和簡單操作。
8.1.2 實驗目的
1.理解 Python 正則表達式的含義。
2.掌握和 Python 正則表達式的基本操作。
8.2 實驗任務配置
8.2.1 概念知識
Python 正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。
Python 自 1.5 版本起增加了 re 模塊,它提供 Perl 風格的正則表達式模式。
re 模塊使 Python 語言擁有全部的正則表達式功能。
compile 函數根據一個模式字符串和可選的標志參數生成一個正則表達式對象。該對象擁有一系列方法用于正則表達式匹配和替換。
re 模塊也提供了與這些方法功能完全一致的函數,這些函數使用一個模式字符串做為它們的第一個參數。
本章節主要介紹 Python 中常用的正則表達式處理函數。
8.2.2 實驗內容
步驟 1 re.match 函數
re.match 嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match() 就返回 none。
函數語法:
re.match(pattern, string, flags=0)
實例:
>>> import re
>>> print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
>>> print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配輸出結果:
(0, 3)
None
步驟 2 re.search 方法
re.search 掃描整個字符串并返回第一個成功的匹配。函數語法:
re.search(pattern, string, flags=0)
實例:
>>> import re
>>> line = "Cats are smarter than dogs"
>>> searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
>>> if searchObj:
>>> print("searchObj.group() : ", searchObj.group())
>>> print("searchObj.group(1) : ", searchObj.group(1))
>>> print("searchObj.group(2) : ", searchObj.group(2))
>>> else:
>>> print("Nothing found!!" )
以上實例執行結果如下:
searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats
searchObj.group(2) : smarter
步驟 3 re.match 與 re.search 的區別
re.match 只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回
None;而 re.search 匹配整個字符串,直到找到一個匹配。
>>> import re
>>> line = "Cats are smarter than dogs";
>>> matchObj = re.match( r'dogs', line, re.M|re.I)
>>> if matchObj:
>>> print("match --> matchObj.group() : ", matchObj.group())
>>> else:
>>> print("No match!!")
>>> matchObj = re.search( r'dogs', line, re.M|re.I)
>>> if matchObj:
>>> print("search --> matchObj.group() : ", matchObj.group())
>>> else:
>>> print("No match!!")
以上實例運行結果如下:
No match!!
search --> matchObj.group() : dogs
步驟 4 檢索和替換
Python 的 re 模塊提供了 re.sub 用于替換字符串中的匹配項。語法:
re.sub(pattern, repl, string, count=0, flags=0)
>>> import re
>>> phone = "2004-959-559 # 這是一個國外電話號碼"
# 刪除字符串中的 Python 注釋
>>> num = re.sub(r'#.*$', "", phone)
>>> print("電話號碼是: ", num)
# 刪除非數字(-)的字符串
>>> num = re.sub(r'\D', "", phone)
>>> print("電話號碼是 : ", num)
結果如下:
電話號碼是: 2004-959-559
電話號碼是 : 2004959559
步驟 5 re.compile 函 數
compile 函數用于編譯正則表達式,生成一個正則表達式( Pattern )對象,供 match() 和
search() 這兩個函數使用。
語法格式為:
re.compile(pattern[, flags])
>>>import re
>>> pattern = re.compile(r'\d+') # 用于匹配至少一個數字
>>> m = pattern.match('one12twothree34four') # 查找頭部,沒有匹配
>>> print(m) None
>>> m = pattern.match('one12twothree34four', 2, 10) # 從'e'的位置開始匹配,沒有匹配
>>> print(m)
None
>>> m = pattern.match('one12twothree34four', 3, 10) # 從'1'的位置開始匹配,正好匹配
>>> print(m) # 返回一個 Match 對象
<_sre.SRE_Match object at 0x10a42aac0>
>>> m.group(0) # 可省略 0
'12'
>>> m.start(0) # 可 省 略 0
3
>>> m.end(0) # 可 省 略 0
5
>>> m.span(0) # 可 省 略 0
(3, 5)
步驟 6 findall
在字符串中找到正則表達式所匹配的所有子串,并返回一個列表,如果沒有找到匹配的,則返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。語法格式為:
findall(string[, pos[, endpos]])
>>> import re
>>> pattern = re.compile(r'\d+') # 查找數字
>>> result1 = pattern.findall('runoob 123 google 456')
>>> result2 = pattern.findall('run88oob123google456', 0, 10)
>>> print(result1)
>>> print(result2)
輸出結果:
['123', '456']
['88', '12']
步驟 7 re.finditer
和 findall 類似,在字符串中找到正則表達式所匹配的所有子串,并把它們作為一個迭代器返回。
re.finditer(pattern, string, flags=0)
>>> import re
>>> it = re.finditer(r"\d+","12a32bc43jf3")
>>> for match in it:
>>> print(match.group())
輸出結果:
12
32
43
3
步驟 8 re.split
split 方法按照能夠匹配的子串將字符串分割后返回列表,它的使用形式如下:
re.split(pattern, string[, maxsplit=0, flags=0])
實例:
>>>import re
>>> re.split('\W+', 'runoob, runoob, runoob.') ['runoob', 'runoob', 'runoob', '']
>>> re.split('(\W+)', ' runoob, runoob, runoob.')
['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
>>> re.split('\W+', ' runoob, runoob, runoob.', 1)
['', 'runoob, runoob, runoob.']
>>> re.split('a*', 'hello world') # 對于找不到匹配的字符串而言,split 不會對其作分割
['hello world']
上一篇: {MyBatis}操作數據庫
下一篇: {HTML5}基礎核心-第二節-上