摘要:正則表達(dá)式就是用來描述他稱為正則集的代數(shù)的表達(dá)式,因此采用正則表達(dá)式這個術(shù)語。文本中正則表達(dá)式結(jié)束搜索的索引值與和方法的同名參數(shù)相同。對象是一個編號的正則表達(dá)式通過提供的一系列方法可以對文本進(jìn)行匹配查找。
一、概述
今天這篇文章帶領(lǐng)大家學(xué)習(xí)一下Python中的正則表達(dá)式,當(dāng)然了,正則表達(dá)式本身的內(nèi)容就足以寫好幾本書了,我們這里列出的內(nèi)容,僅僅是Python中常用的和基礎(chǔ)的一些內(nèi)容。
那么我們?yōu)槭裁匆獙W(xué)習(xí)正則表達(dá)式呢,是因為正則表達(dá)式是為了提高復(fù)雜文本分析的效率,簡單點(diǎn)說就是假設(shè)要自己想吃一份蛋炒飯,就需要有很多的流程,比如淘米,煮米,打蛋,炒飯等很多步驟,正則表達(dá)式呢就相當(dāng)于直接到樓下的餐廳去買一份蛋炒飯去吃了,所以學(xué)會了正則表達(dá)式就會節(jié)省很多時間,讓我們更快速的”吃到”我們想要的東西。
正則表達(dá)式的"祖先"可以一直上溯至對人類神經(jīng)系統(tǒng)如何工作的早期研究。Warren McCulloch 和 Walter Pitts 這兩位神經(jīng)生理學(xué)家研究出一種數(shù)學(xué)方式來描述這些神經(jīng)網(wǎng)絡(luò)。
1956 年, 一位叫 Stephen Kleene 的數(shù)學(xué)家在 McCulloch 和 Pitts 早期工作的基礎(chǔ)上,發(fā)表了一篇標(biāo)題為"神經(jīng)網(wǎng)事件的表示法"的論文,引入了正則表達(dá)式的概念。正則表達(dá)式就是用來描述他稱為"正則集的代數(shù)"的表達(dá)式,因此采用"正則表達(dá)式"這個術(shù)語。
隨后,發(fā)現(xiàn)可以將這一工作應(yīng)用于使用 Ken Thompson 的計算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要發(fā)明人。正則表達(dá)式的第一個實用應(yīng)用程序就是 Unix 中的 qed 編輯器。
如他們所說,剩下的就是眾所周知的歷史了。從那時起直至現(xiàn)在正則表達(dá)式都是基于文本的編輯器和搜索工具中的一個重要部分。
二、什么是正則表達(dá)式
正則表達(dá)式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為"元字符")。
正則表達(dá)式使用單個字符串來描述、匹配一系列匹配某個句法規(guī)則的字符串。
正則表達(dá)式是繁瑣的,但它是強(qiáng)大的,學(xué)會之后的應(yīng)用會讓你除了提高效率外,會給你帶來絕對的成就感。許多程序設(shè)計語言都支持利用正則表達(dá)式進(jìn)行字符串操作。下面是一些正則表達(dá)式的語法和說明:
看了這么多的正則表達(dá)式的方法是不是感覺頭很大,沒事慢慢來,我們一點(diǎn)點(diǎn)的開始學(xué)習(xí),一點(diǎn)點(diǎn)的練習(xí)早晚就可以學(xué)會的。
三、正則表達(dá)式期初
1.元字符
下面是一些常用的元字符
代碼
說明
.
匹配除換行符意外的任意字符
w
匹配字母或數(shù)字下?lián)Q線或漢字
s
匹配任意的空白符
d
匹配數(shù)字
b
匹配單詞開始或結(jié)束
^
匹配字符串的開始
$
匹配字符串的結(jié)束
2.字符轉(zhuǎn)義
如果要查找元字符本身的話,比如查找.或者的時候就出現(xiàn)了問題:我們沒有辦法指定它們,因為他們會被解釋成別的意思,這個時候就得使用來取消這些字符的特殊意義。因此,要查找.或的時候就應(yīng)該使用.或*來查找,這時候可能就會有人問了,那如果我要查找怎么辦呢,同理用就可以了。
3.重復(fù)
常用的限定符:
代碼語法
說明
*
重復(fù)零次或更多次
+
重復(fù)一次或更多次
?
重復(fù)零次或一次
{n}
重復(fù)N次
{n,}
重復(fù)n次或更多次
{n,m}
重復(fù)n到m次
4.字符類
如果想要匹配沒有預(yù)定義元字符集合(比如元音字母a,e,I,o,u)怎么辦呢?很簡單,只需要需要在方括號里面列出它們就可以了像[aeiou]就可以匹配任何一個英文元音字母,[.?!]匹配標(biāo)點(diǎn)符號(.或?或!)
也可以通過指定一個字符返回:
像[0-9]代碼的含義與d就是完全一致的:一位數(shù)字。同理[a-z0-9A-Z]也完全等同于w(如果只考慮英文的話)
5.分枝條件
正則表達(dá)式里的分枝條件指的是有幾種規(guī)則,如果滿足其中之一的任意規(guī)則都應(yīng)當(dāng)成匹配,具體方法是用|把不同條件分隔開。
(?0d{2})?[- ]?d{8}|0d{2}[0 ]?d{8}這個表達(dá)式匹配3位區(qū)號的電話號碼,其中區(qū)號可以用小括號括起來,也可以不用,區(qū)號與本地號間可以用連字號或空格間隔,也可以沒有間隔
使用分枝條件時,要注意各個條件的順序,如果要把它改成d{5}|d{5}-d{4}的話,那么久只會匹配5位的郵編(以及9位郵編的前5位)。原因是匹配分枝條件時,將會從左到右地測試每個條件,如果滿足某個分枝的話,就不會再管其它的條件了。
6.分組
如果想要重復(fù)多個字符,可以使用小括號來指定子表達(dá)式(也叫做分組),然后就可以指定這個子表達(dá)式的重復(fù)次數(shù)。(d{1,3}.){3}d{1,3}是一個簡單的IP地址匹配表達(dá)式。如果要理解這個表達(dá)式,請按下面的順序分析:d{1,3}匹配1到3位的數(shù)字,(d{1,3}.){3}匹配3位數(shù)字加上一個英語句號(這個整體也就是這個分組)重復(fù)3次,最后再加上一個1到3位的數(shù)字(d{1,3})
注意的是IP地址中的每個數(shù)字都不能大于255,所以上面的匹配方式也會匹配到256.300.669.999這種不可能存在的IP地址,那么應(yīng)該怎么才能改進(jìn)呢?
7.反義
如果有時會需要查找一些不輸入某個能簡單定義的字符類的字符。比如想查找除了數(shù)字以外,其他任意字符都行的情況,這時候就需要用到反義,下面是一些常用的反義代碼
代碼
說明
w
匹配任意不是字母,數(shù)字,下劃線,漢字的字符
s
匹配任意不是空白符的字符
d
匹配任意非數(shù)字的字符
b
匹配不是單詞開頭或結(jié)束的位置
1
匹配除了x以外的任意字符
2
匹配除了aeiou這幾個字母以外的任意字符
8.貪婪與懶惰
當(dāng)正則表達(dá)式中包涵能接受重復(fù)的限定符時,通常的行為是(在使整個表達(dá)式能夠得到匹配的前提下)匹配盡可能多的字符,以這個表達(dá)式為例:a.*b,他將會匹配最長的以a開始,以b結(jié)束的字符串。如果用來搜索aabab的話,它會匹配整個字符串a(chǎn)abab。這也被成為貪婪匹配。
有時候我們更需要懶惰匹配,也就是匹配盡可能少的字符,前面給出的限定符都可以轉(zhuǎn)化為懶惰匹配模式,只要在它后面加上一個問號?,這樣.*?就意味著匹配任意數(shù)量的重復(fù),但是在能使整個匹配成功的前提下使用最少的重復(fù)。
下面是一些懶惰限定符:
代碼
說明
*?
重復(fù)任意次,但盡可能少重復(fù)
+?
重復(fù)1次或更多次, 但盡可能少重復(fù)
??
重復(fù)0次貨1次, 但盡可能少重復(fù)
{n,m}?
重復(fù)n次到m次, 但盡可能少重復(fù)
{n,}?
重復(fù)n次以上, 但盡可能少重復(fù)
四、Python中的re模塊
Python中通過re模塊提供對正則表達(dá)式的支持。使用re的一般步驟是先將正則表達(dá)式的字符串形式編譯為pattern實例,然后使用pattern實例處理文本并獲得匹配結(jié)果(一個match實例),最后使用match實例獲得信息,進(jìn)行其他操作
1.導(dǎo)入re模塊
2.將正則表達(dá)式編譯為pattern對象
3.使用pattern匹配文本,獲得匹配結(jié)果,無法匹配時將返回None
4.re.compile(strPattern[,flag]):
這個方法是pattern類的工程方法,用于將字符串形式的正則表達(dá)式編譯為pattern對象,第二個參數(shù)是匹配模式,去值可以使用按位或運(yùn)算符’|’表示同時生效,比如re.I|re.M’
可選值有下面六種:
Re.I(re.IGNORECASE):忽略大小寫(括號內(nèi)是完整寫法,下同)
M(MULTILINE):多行模式,改變^和$的行為
S(DOTALL):點(diǎn)任意匹配模式,改變.的行為
L(LOCALE):使預(yù)定字符類w W b B s S取決于當(dāng)前區(qū)域設(shè)定
U(UNICODE):使預(yù)定字符類w W b B s S d D取決于unicode定義的字符屬性
X(VERBOSE):詳細(xì)信息:這個模式下正則表達(dá)式可以是多行,忽略空白字符,并可以加入注釋
Re提供了眾多模塊方法用于完成正則表達(dá)式的功能,這些方法可以使用pattern實例的相應(yīng)方法替代,唯一的好處是少些了一行re.compole()代碼,但同時也無法復(fù)用編譯后的pattern對象,這些方法將在pattern類的實例方法一起介紹,如上面這個例子可以簡寫為:
5.match對象
Match對象是一次匹配的結(jié)果,包含了很多關(guān)于此次匹配的信息,可以使用match提供的可讀屬性或方法來獲取這些信息
Match屬性:
String:匹配使用的文本
Re:匹配使用pattern對象
Pos:文本中正則表達(dá)式開始搜索的索引,值與pattern.match()和pattern.seach()方法的同名參數(shù)相同。
Endpos:文本中正則表達(dá)式結(jié)束搜索的索引,值與pattern.match()和pattern.seach()方法的同名參數(shù)相同。
Lastindex:最后一個被捕獲的分組在文本中的索引,如果沒有被捕獲的分組,將為None
Lastgroup:最后一個被捕獲的分組的別名,如果這個分組沒有別名或者被捕獲的分組,將為None
Match方法:
group([group1,...]):
獲得一個或多個分組截獲的字符串;指定多個參數(shù)時將以元組形式返回。group1 可以使用編號也可以使用別名;編號0代表整個匹配的子串;不填寫參數(shù)時,返回group(0) ;沒有截獲字符串的組返回None ;截獲了多次的組返回最后一次截獲的子串。
●groups(default]):
以元組形式返回全部分組截獲的字符串。相當(dāng)于調(diào)用group(1,2... last)。default表示沒有截獲字符串的組以這個值替代,默認(rèn)為None。
groupdict([default]):
返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典,沒有別名的組不包含在內(nèi)。defalt含義同上。
●start([group]):
返回指定的組截獲的子串在string中的起始索引(子串第一個字符的索引) 。group默認(rèn)值為0。
●end([group):
返回指定的組截獲的子串在string中的結(jié)束索引(子串最后一個字符的索引+1 ). group默認(rèn)值為0。
●span([group]):
返回(start(group),end(group))。
●expand(template):
將匹配到的分組代入template中然后返回。template中可以使用id或g、 g引用分組,但不能使用編號0。id與g是等價的;但10將被認(rèn)為是第10個分組,如果你想表達(dá)1之后是字符"0",只能使g0。
6.pattwern
Pattern對象是一個編號的正則表達(dá)式,通過pattern提供的一系列方法可以對文本進(jìn)行匹配查找。Pattern不能直接實例化,必須使用re.compile進(jìn)行()構(gòu)造。Pattern提供了幾個可讀屬性用于獲取表達(dá)式的相關(guān)信息:
pattern:編譯時用的表達(dá)式字符串。
flags:編譯時用的匹配模式。數(shù)字形式
groups:表達(dá)式中分組的數(shù)量
groupindex:以表達(dá)式中有別名的租的別名為鍵、以改組對應(yīng)的編號為值的字典,沒有別名的租不包含在內(nèi)。
注意:在表達(dá)式前面使用’r’是用來表示字符串內(nèi)部不需要進(jìn)行額外的轉(zhuǎn)義(原生字符串),可以避免很多無法察覺的問題。
五、re模塊的方法
實例方法[re模塊方法]:
1.match(string[,pos[,endpos]])|re.match(pattern,string[,flags]):
這個方法將從string的pos下標(biāo)處嘗試匹配pattern;如果pattern結(jié)束時仍可匹配,則返回一個match對;如果匹配過程中pattern無法匹配,或則匹配未結(jié)束就已到達(dá)endpos,則返回None。
Pos和endpos的默認(rèn)值分別為0和len(string);re.match()無法指定這兩個參數(shù),參數(shù)flags用于編譯pattern時指定匹配模式。
這個方法并不是完全匹配,當(dāng)pattern結(jié)束時若string還有剩余字符,仍然十位成功。想要完全匹配可以在表達(dá)式末尾加上邊界匹配符$。
2.search(string[,pos[,endpos]])|re.search(pattern,string[,flags]):
這個方法用于查找字符串中可以匹配成功的子串,從string的pos下標(biāo)處嘗試匹配pattern,如果pattern結(jié)束時仍可匹配,則返回一個match對象;若無法匹配則將pos加1后重新嘗試匹配;知道pos=endpos時無法匹配則返回None。
Pos和endpos的默認(rèn)值分別為0和len(string);re.search()無法指定這兩個參數(shù),參數(shù)flags用于編譯pattern時指定匹配模式。
3.split(string[,maxsplit])|re.split(pattern,string[,maxsplit])’
按照能夠匹配的子串將string分割后返回列表。Maxsplit用于指定最大分隔次數(shù),不指定將全部分隔。
4.findall(string[,pos[,endpos]])|re.findall(pattern,string[,flags]):
搜索string,以列表的形式返回全部能匹配的子串
5.finditer(string[,pos[,endpos]])|re.finditer(pattern,string[.flags]):
搜索string,返回一個順序訪問每一個匹配結(jié)果(match對象)的迭代器
6.sub(repl,string[,count])|re.sub(pattern,repl,string[,count]):
使用repl替換string中的每一個匹配的子串后返回替換的字符串。當(dāng)repl是一個字符串時,可以使用id或g、g引用分組,但不能使用編號0。當(dāng)repl是一個方法時,這個方法應(yīng)當(dāng)只接受一個參數(shù)(match對象),并返回一個字符串用于替換(返回的字符串不能再引用分組)。
Count用于指定最多替換次數(shù),不指定時全部替換。
7.subn(repl,string[,count])|re.sub(pattern,repl,string[,count]):
返回(sub(repl,string[,count]),替換次數(shù))。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43608.html
摘要:正則表達(dá)式關(guān)閉或可選標(biāo)志。如果所含正則表達(dá)式,以表示,在當(dāng)前位置成功匹配時成功,否則失敗。否則指的是八進(jìn)制字符碼的表達(dá)式。 正則表達(dá)式是個很牛逼的東西,不管是在javascript,還是在Python web開發(fā)(http://www.maiziedu.com/course/python-px...)中,我們都會遇到正則表達(dá)式,雖然javascript和Python的正則表達(dá)式區(qū)別不大...
摘要:反斜杠的困擾與大多數(shù)編程語言相同,正則表達(dá)式里使用作為轉(zhuǎn)義字符,這就可能造成反斜杠困擾。文本中正則表達(dá)式結(jié)束搜索的索引。以元組形式返回全部分組截獲的字符串。用于指定最大分割次數(shù),不指定將全部分割。 1. 正則表達(dá)式基礎(chǔ) 1.1. 簡單介紹 正則表達(dá)式并不是Python的一部分。正則表達(dá)式是用于處理字符串的強(qiáng)大工具,擁有自己獨(dú)特的語法以及一個獨(dú)立的處理引擎,效率上可能不如str自帶的方法...
摘要:標(biāo)記一個子表達(dá)式的開始和結(jié)束位置。用和進(jìn)行搜索和替換二者幾乎是一樣的,都是將某字符串中所有匹配正則表達(dá)式模式的部分進(jìn)行替換。 【未完成初稿】這周在工作中遇到很多需要從一段字符中增刪查改的工作,第一遍用自己寫的腳本去做,結(jié)果是可重用性不高,而且效率也不太好。其中也用到了python中的正則表達(dá)式部分re,后來就想能不能將我遇到的這類問題全部用正則去解決,具體就是python的re模塊。答...
摘要:正則表達(dá)式語法字符與字符類特殊字符以上特殊字符要想使用字面值,必須使用進(jìn)行轉(zhuǎn)義字符類包含在中的一個或者多個字符被稱為字符類,字符類在匹配時如果沒有指定量詞則只會匹配其中的一個。 1. 正則表達(dá)式語法 1.1 字符與字符類 1 特殊字符:.^$?+*{}| 以上特殊字符要想使用字面值,必須使用進(jìn)行轉(zhuǎn)義 2 字符類 1. 包含在[]中的一個或者多個字符被稱為字符類,字符類在匹配時如果沒有指...
摘要:在中,使用的內(nèi)置模塊處理正則表達(dá)式操作。使用正則表達(dá)式對象在字符串中搜索模式。編寫和使用正則表達(dá)式在中創(chuàng)建正則表達(dá)式的第一步是導(dǎo)入模塊正則表達(dá)式使用模式字符串表示,模式字符串是指定所需搜索模式的字符串。 showImg(https://segmentfault.com/img/remote/1460000019166945?w=504&h=300); 來源 | 愿碼(ChainDes...
摘要:假設(shè)現(xiàn)在想把字符串你好,,世界中的中文提取出來,可以這么做你好,,世界注意到,我們在正則表達(dá)式前面加上了兩個前綴,其中表示使用原始字符串,表示是字符串。本文標(biāo)題為正則表達(dá)式模塊簡明筆記本文鏈接為參考資料正則表達(dá)式 簡介 正則表達(dá)式(regular expression)是可以匹配文本片段的模式。最簡單的正則表達(dá)式就是普通字符串,可以匹配其自身。比如,正則表達(dá)式 hello 可以匹配字符...
閱讀 2870·2021-10-11 10:57
閱讀 2434·2021-08-27 16:20
閱讀 1414·2019-08-30 13:03
閱讀 1587·2019-08-30 12:50
閱讀 3373·2019-08-29 14:16
閱讀 1587·2019-08-29 11:12
閱讀 1641·2019-08-28 17:53
閱讀 2920·2019-08-27 10:58