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