您好,登錄后才能下訂單哦!
怎么使用Python re正則表達(dá)式模塊?相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
正則表達(dá)式(Regular Expression)用于描述一種字符串匹配的模式,它可用于檢查一個字符串是否含有某個子串,也可用于從字符串中提取匹配的子串,或者對字符串中匹配的子串執(zhí)行替換操作。
很多讀者都會覺得正則表達(dá)式是非常神奇、高級的知識,實(shí)際上正則表達(dá)式確實(shí)是一種非常實(shí)用的工具。正則表達(dá)式的入門并不難,任意字符串都可以被當(dāng)成正則表達(dá)式來使用,例如“abc”,它也是一個正則表達(dá)式,只是它只能匹配“abc”字符串。
當(dāng)然,如果正則表達(dá)式僅能匹配“abc”這樣的字符串,那么正則表達(dá)式也就不值得學(xué)習(xí)了。事實(shí)上,正則表達(dá)式包含的知識點(diǎn)比較多,它的模式匹配能力也非常強(qiáng),初學(xué)者可以由淺入深地學(xué)習(xí)。
對于 Python 開發(fā)者來說,掌握正則表達(dá)式確實(shí)是一個很重要的技能。在掌握了正則表達(dá)式之后,Python 開發(fā)者也可使用正則表達(dá)式來開發(fā)數(shù)據(jù)抓取、網(wǎng)絡(luò)爬蟲等程序。
實(shí)際上,掌握 Python 的正則表達(dá)式并不難,無非就是幾個簡單的函數(shù)。在 Python 的交互式解釋器中先導(dǎo)入 re 模塊,然后輸入 re.__all__ 命令,即可看到該模塊所包含的全部屬性和函數(shù):
>>> re.__all__ ['match', 'fullmatch', 'search', 'sub', 'subn', 'split', 'findall', 'finditer', 'compile', 'purge', 'template', 'escape', 'error', 'A', 'I', 'L', 'M', 'S', 'X', 'U', 'ASCII', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL', 'VERBOSE', 'UNICODE']
從上面的輸出結(jié)果可以看出,re 模塊包含了為數(shù)不多的幾個函數(shù)和屬性(用于控制正則表達(dá)式匹配的幾個選項(xiàng))。下面先介紹這些函數(shù)的作用:
re.compile(pattern, flags=0):該函數(shù)用于將正則表達(dá)式字符串編譯成 _sre.SRE_Pattern 對象,該對象代表了正則表達(dá)式編譯之后在內(nèi)存中的對象,它可以緩存并復(fù)用正則表達(dá)式字符串。如果程序需要多次使用同一個正則表達(dá)式字符串,則可考慮先編譯它。
該函數(shù)的 pattern 參數(shù)就是它所編譯的正則表達(dá)式字符串,flags 則代表了正則表達(dá)式的匹配旗標(biāo)。編譯得到的 _sre.SRE_Pattern 對象包含了 re 模塊中絕大部分函數(shù)對應(yīng)的方法。比如下面兩行代碼表示先編譯正則表達(dá)式,然后調(diào)用正則表達(dá)式的 search() 方法執(zhí)行匹配:
#先編譯正則表達(dá)式 p = re.compile('abc') #調(diào)用_sre.SRE_Pattern 對象的search()方法 p.search("www.abc.com")
上面兩行代碼和下面代碼的效果基本相同:
#直接用正則表達(dá)式匹配目標(biāo)字符串 re.search('abc','www.abc.com')
對于上面兩種方式,由于第一種方式預(yù)編譯了正則表達(dá)式,因此程序可復(fù)用 p 對象(該對象緩存了正則表達(dá)式字符串),所以具有更好的性能。re.match(pattern, string, flags=0):嘗試從字符串的開始位置來匹配正則表達(dá)式,如果從開始位置匹配不成功,match() 函數(shù)就返回 None 。其中 pattern 參數(shù)代表正則表達(dá)式;string 代表被匹配的字符串;flags 則代表正則表達(dá)式的匹配旗標(biāo)。該函數(shù)返回 _sre.SRE_Match 對象,該對象包含的 span(n) 方法用于獲取第 n+1 個組的匹配位置,group(n) 方法用于獲取第 n+1 個組所匹配的子串。re.search(pattern, string, flags=0):掃描整個字符串,并返回字符串中第一處匹配 pattern 的匹配對象。其中 pattern 參數(shù)代表正則表達(dá)式;string 代表被匹配的字符串;flags 則代表正則表達(dá)式的匹配旗標(biāo)。該函數(shù)也返回 _sre.SRE_Match 對象。
根據(jù)上面介紹不難發(fā)現(xiàn),match() 與 search() 的區(qū)別在于,match() 必須從字符串開始處就匹配,但 search() 可以搜索整個字符串。例如如下程序:
import re m1 = re.match('www', 'www.fkit.org')# 開始位置可以匹配 print(m1.span()) # span返回匹配的位置 print(m1.group()) # group返回匹配的組 print(re.match('fkit', 'www.fkit.com')) # 開始位置匹配不到,返回None m2 = re.search('www', 'www.fkit.org') # 開始位置可以匹配 print(m2.span()) print(m2.group()) m3 = re.search('fkit', 'www.fkit.com') # 中間位置可以匹配,返回Match對象 print(m3.span()) print(m3.group())
運(yùn)行上面程序,可以看到如下輸出結(jié)果:
(0, 3) www None (0, 3) www (4, 8) fkit
從上面的輸出結(jié)果可以看出,match() 函數(shù)要求必須從字符串開始處匹配,而 search() 函數(shù)則可掃描整個字符串,從中間任意位置開始匹配。re.findall(pattern, string, flags=0):掃描整個字符串,并返回字符串中所有匹配 pattern 的子串組成的列表。其中 pattern 參數(shù)代表正則表達(dá)式;string 代表被匹配的宇符串;flags 則代表正則表達(dá)式的匹配旗標(biāo)。re.finditer(pattern, string, flags=0):掃描整個字符串,并返回字符串中所有匹配 pattern 的子串組成的迭代器,迭代器的元素是 _sre.SRE_Match 對象。其中 pattern 參數(shù)代表正則表達(dá)式;string 代表被匹配的字符串;flags 則代表正則表達(dá)式的匹配旗標(biāo)。
從上面介紹不難看出,findall() 與 finditer() 函數(shù)的功能基本相似,區(qū)別在于它們的返回值不同,findall() 函數(shù)返回所有匹配 patten 的子串組成的列表;而 finditer() 函數(shù)則返回所有匹配 pattern 的子串組成的選代器。
如果對比 findall()、finditer() 和 search() 函數(shù),它們的區(qū)別也很明顯,search() 只返回字符串中第一處匹配 pattern 的子串;而 findall() 和 finditer() 則返回字符串中所有匹配 pattern 的子串。
import re # 返回所有匹配pattern的子串組成的列表, 忽略大小寫 print(re.findall('fkit', 'FkIt is very good , Fkit.org is my favorite' , re.I)) # 返回所有匹配pattern的子串組成的迭代器, 忽略大小寫 it = re.finditer('fkit', 'FkIt is very good , Fkit.org is my favorite' , re.I) for e in it: print(str(e.start()) + "-->" + e.group())
re.fullmatch(pattem, string, flags=0):該函數(shù)要求整個字符串能匹配 pattern,如果匹配則返回包含匹配信息的 _sre.SRE_Match 對象;否則返回 None。re.sub(pattern, repl, string, count=0, flags=0):該函數(shù)用于將 string 字符串中所有匹配 pattern 的內(nèi)容替換成 repl;repl 既可是被替換的字符串,也可是一個函數(shù)。count 參數(shù)控制最多替換多少次,如果指定 count 為 0 ,則表示全部首換。如下程序示范了 sub() 函數(shù)的簡單用法:
import re my_date = '2008-08-18' # 將my_date字符串里中畫線替換成斜線 print(re.sub(r'-', '/' , my_date)) # 將my_date字符串里中畫線替換成斜線,只替換一次 print(re.sub(r'-', '/' , my_date, 1))
運(yùn)行上面程序,可以看到如下輸出結(jié)果:
2008/08/18 2008/08-18
看完上述內(nèi)容,你們掌握怎么使用Python re正則表達(dá)式模塊的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。