Python中正則表達(dá)式的巧妙使用一文包你必掌握正則
前言
正則表達(dá)式就是從字符串中發(fā)現(xiàn)規(guī)律,并通過“抽象”的符號表達(dá)出來。打個比方,對于2,5,10,17,26,37這樣的數(shù)字序列,如何計(jì)算第7個值,肯定要先找該序列的規(guī)律,然后用n2+1這個表達(dá)式來描述其規(guī)律,進(jìn)而得到第7個值為50。對于需要匹配的字符串來說,同樣把發(fā)現(xiàn)規(guī)律作為第一步,本文主要使用正則表達(dá)式完成字符串的查詢匹配、替換匹配和分割匹配。

常用的正則符號
在進(jìn)入字符串的匹配之前,先來了解一下都有哪些常用的正則符號,見下表所示:

如果讀者能夠比較熟練地掌握上表中的內(nèi)容,相信在字符串處理過程中將會游刃有余。如前文所說,本節(jié)將基于正則表達(dá)式完成字符串的查詢、替換和分割操作,這些操作都需要導(dǎo)入re模塊,并使用如下介紹的幾個函數(shù)。
字符串的匹配查詢
re模塊中的findall函數(shù)可以對指定的字符串進(jìn)行遍歷匹配,獲取字符串中所有匹配的子串,并返回一個列表結(jié)果。該函數(shù)的參數(shù)含義如下:
findall(pattern, string, flags=0)
pattern:指定需要匹配的正則表達(dá)式。
string:指定待處理的字符串。
flags:指定匹配模式,常用的值可以是re.I、re.M、re.S和re.X。re.I的模式是讓正則表達(dá)式對大小寫不敏感;re.M的模式是讓正則表達(dá)式可以多行匹配;re.S的模式指明正則符號.可以匹配任意字符,包括換行符 ;re.X模式允許正則表達(dá)式可以寫得更加詳細(xì),如多行表示、忽略空白字符、加入注釋等。
字符串的匹配替換
re模塊中的sub函數(shù)的功能是替換,類似于字符串的replace方法,該函數(shù)根據(jù)正則表達(dá)式把滿足匹配的內(nèi)容替換為repl。該函數(shù)的參數(shù)含義如下:
sub(pattern, repl, string, count=0, flags=0)
pattern:同findall函數(shù)中的pattern。
repl:指定替換成的新值。
string:同findall函數(shù)中的string。
count:用于指定最多替換的次數(shù),默認(rèn)為全部替換。
flags:同findall函數(shù)中的flags。
字符串的匹配分割
re模塊中的split函數(shù)是將字符串按照指定的正則表達(dá)式分隔開,類似于字符串的split方法。該函數(shù)的具體參數(shù)含義如下:
split(pattern, string, maxsplit=0, flags=0)
pattern:同findall函數(shù)中的pattern。
maxsplit:用于指定最大分割次數(shù),默認(rèn)為全部分割。
string:同findall函數(shù)中的string。
flags:同findall函數(shù)中的flags。
實(shí)戰(zhàn)案例
如果上面的函數(shù)和參數(shù)含義都已經(jīng)掌握了,還需要進(jìn)一步通過案例加強(qiáng)理解,接下來舉例說明上面的三個函數(shù):
# 導(dǎo)入用于正則表達(dá)式的re模塊
import re
# 取出字符串string8中所有的天氣狀態(tài)
string8 = "{ymd:'2018-01-01',tianqi:'晴',aqiInfo:'輕度污染'},{ymd:'2018-01-02',tianqi:'陰~小雨',aqiInfo:'優(yōu)'},{ymd:'2018-01-03',tianqi:'小雨~中雨',aqiInfo:'優(yōu)'},{ymd:'2018-01-04',tianqi:'中雨~小雨',aqiInfo:'優(yōu)'}"
# 基于正則表達(dá)式使用findall函數(shù)
print(re.findall("tianqi:'(.*?)'", string8))
# 取出string9中所有含O字母的單詞
string9 = 'Together, we discovered that a free market only thrives when there are rules to ensure competition and fair play, Our celebration of initiative and enterprise'
# 基于正則表達(dá)式使用findall函數(shù)
print(re.findall('w*ow*',string9, flags = re.I))
# 將string10中的標(biāo)點(diǎn)符號、數(shù)字和字母刪除
string10 = '據(jù)悉,這次發(fā)運(yùn)的4臺蒸汽冷凝罐屬于國際熱核聚變實(shí)驗(yàn)堆(ITER)項(xiàng)目的核二級壓力設(shè)備,先后完成了壓力試驗(yàn)、真空試驗(yàn)、氦氣檢漏試驗(yàn)、千斤頂試驗(yàn)、吊耳載荷試驗(yàn)、疊裝試驗(yàn)等驗(yàn)收試驗(yàn)。'
# 基于正則表達(dá)式使用sub函數(shù)
print(re.sub('[,。、a-zA-Z0-9()]','',string10))
# 將string11中的每個子部分內(nèi)容分割開
string11 = '2室2廳 | 101.62平 | 低區(qū)/7層 | 朝南
上海未來 - 浦東 - 金楊 - 2005年建'
# 基于正則表達(dá)式使用split函數(shù)
split = re.split('[-|
]', string11)
print(split)
# 分割結(jié)果的清洗
split_strip = [i.strip() for i in split]
print(split_strip)
out:
['晴', '陰~小雨', '小雨~中雨', '中雨~小雨']
['Together', 'discovered', 'only', 'to', 'competition', 'Our', 'celebration', 'of']
據(jù)悉這次發(fā)運(yùn)的臺蒸汽冷凝罐屬于國際熱核聚變實(shí)驗(yàn)堆項(xiàng)目的核二級壓力設(shè)備先后完成了壓力試驗(yàn)真空試驗(yàn)氦氣檢漏試驗(yàn)千斤頂試驗(yàn)吊耳載荷試驗(yàn)疊裝試驗(yàn)等驗(yàn)收試驗(yàn)
['2室2廳 ', ' 101.62平 ', ' 低區(qū)/7層 ', ' 朝南 ', ' 上海未來 ', ' 浦東 ', ' 金楊 ', ' 2005年建']
['2室2廳', '101.62平', '低區(qū)/7層', '朝南', '上海未來', '浦東', '金楊', '2005年建']
如上結(jié)果所示,在第一個例子中通過正則表達(dá)式"tianqi:'(.*?)'"實(shí)現(xiàn)目標(biāo)數(shù)據(jù)的獲取,如果不使用括號的話,就會產(chǎn)生類似"tianqi:'晴'", "tianqi:'陰~小雨'"這樣的值,所以,加上括號就是為了分組,且僅返回組中的內(nèi)容;
第二個例子并沒有將正則表達(dá)式寫入圓括號,如果寫上圓括號也是返回一樣的結(jié)果,所以findall就是用來返回滿足匹配條件的列表值,如果有括號,就僅返回括號內(nèi)的匹配值;
第三個例子使用替換的方法,將所有的標(biāo)點(diǎn)符號換為空字符,進(jìn)而實(shí)現(xiàn)刪除的效果;
第四個例子是對字符串的分割,如果直接按照正則 '[,。、a-zA-Z0-9()]' 分割的話,返回的結(jié)果中包含空字符,如 '2室2廳' 后面就有一個空字符。為了刪除列表中每個元素的首尾空字符,使用了列表表達(dá)式,并且結(jié)合字符串的strip方法完成空字符的壓縮。
總結(jié)
以上所述是小編給大家介紹的Python中正則表達(dá)式的巧妙使用一文包你必掌握正則,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!
相關(guān)文章
notepad++ 等用正則表達(dá)式自動添加sql引號的技巧
本篇文章給大家介紹notepad用正則表達(dá)式自動添加sql引號的技巧,,需要的朋友可以參考下2015-10-10
php中常用的正則表達(dá)式的介紹及應(yīng)用實(shí)例代碼
在編寫處理字符串的程序或網(wǎng)頁時,經(jīng)常會有查找符合某些復(fù)雜規(guī)則的字符串的需要。正則表達(dá)式就是用于描述這些規(guī)則的語法。2009-12-12
Linux正則表達(dá)式特性詳解及BRE與ERE的異同點(diǎn)
本篇文章給大家介紹linux正則表達(dá)式特性及BRE與ERE的不同,Linux正則表達(dá)式(Regular Expression)主要遵從POSIX BRE或者POSIX ERE標(biāo)準(zhǔn),對linux正則表達(dá)式感興趣的朋友可以參考下本篇文章2015-10-10
JavaScript中常用的正則表達(dá)式日常整理(全)
本篇文章是小編日常整理有關(guān)js常用的正則表達(dá)式,比較全面,對大家學(xué)習(xí)javascript正則表達(dá)式非常有用,需要的朋友一起學(xué)習(xí)吧2015-09-09
php正則之函數(shù) preg_replace()參數(shù)說明
php正則之函數(shù) preg_replace()參數(shù)說明...2007-03-03
計(jì)算一個字符串在另一字符串中出現(xiàn)的次數(shù)函數(shù)
計(jì)算一個字符串在另一字符串中出現(xiàn)的次數(shù)函數(shù)2008-03-03

