Python 正規表示式教程| D棧

文章推薦指數: 80 %
投票人數:10人

Tutorial of Python Regular Expression Module. ... Python 中的正規表示式是一組字元或序列,用於使用正式語法將字串與另一個模式匹配。

你可以將正規表示式視為嵌入 ... Python庫/模組教程 Python正規表示式教程 reportthisad 教程 Python庫/模組教程 Python正規表示式教程 match()函式 search()函式 編譯正規表示式 標誌位flags 檢查允許的字元 搜尋和替換 findall()函式 finditer()函式 split()函式 Basicpatternsofre的基本模式 重複情形 非貪婪匹配 正規表示式中的特殊字元和轉義 轉義函式escape group()方法 在本教程中,我們將學習正規表示式以及Pythonre中模組中定義的正規表示式操作。

re是Python的標準庫,它支援正規表示式的匹配操作。

Python中的正規表示式是一組字元或序列,用於使用正式語法將字串與另一個模式匹配。

你可以將正規表示式視為嵌入在python中的小型程式語言。

你可以使用正規表示式來定義一些規則,然後使用這些規則從你希望與模式匹配的給定字串中建立可能的字串。

Python中的正規表示式被解釋為一組指令。

match()函式 你可以使用match()函式將RE模式與給定字串來匹配。

match()函式也包含了標誌,標誌定義正規表示式的行為,它可以有不同的值,後續我們在本教程會繼續講到。

以下是Python中match()函式的語法: re.match(pattern,string,flags) 它有三個引數, pattern是要匹配的正規表示式模式 string是與正規表示式匹配的給定字串 flags用於更改正規表示式的行為,這是個可選項 如果匹配成功就返回Match物件,否則返回NONE。

匹配物件Match還有兩個主要方法,即group(num)和group()。

可以使用這些方法來分別返回匹配的特定子序列和所有子序列。

使用match函式 我們來看下如何使用match函式, importre strTest="HelloPythonProgramming" mobj=re.match(r"hello",strTest,re.I) print(mobj.group()) 第一行如何匯入了re模組, 第二行是我們需要匹配的字串HelloPythonProgramming, 第三行是需要將該字串跟匹配模式r"Hello"比較,並且re.I指定的匹配模式是忽略大小寫。

最終匹配的結果賦值給mobj 第四行將匹配的結果給列印出來,結果如下, Hello 在此示例中,使用字首r來表示字串是原始字串。

在原始字串中,在使用轉義序列時不需要寫雙斜槓,例如,如果你想要一個反斜槓,那麼你只需要一個\,而不用像普通字串那樣的雙反斜槓\\。

match函式與常規字串 我們來看一個不用原始字串而用常規字串來做匹配的例子, importre str="\\tHelloPythonProgramming" mobj=re.match("\\thello",str,re.I)#nomatch str="\tHelloPythonProgramming" mobj=re.match("\\thello",str,re.I)#\thelloismatching search()函式 你可以使用search()函式搜尋給定字串中的正規表示式匹配模式。

search有三個輸入引數,匹配模式,給定字串以及可選的匹配行為選項flags 以下是Python中search函式的語法, re.search(pattern,string,flags) 我們來看具體的search()函式使用例項, importre str="HelloPythonProgramming" sobj=re.search(r"programming",str,re.I) print(sobj.group()) Programming 在此程式碼中,我們來搜尋給定字串中是否存在programming,search函式搜尋整個字串。

搜尋search和匹配match之間的區別在於match函式只檢查字串的開頭,而search在整個字串中搜尋。

在字串開頭搜尋 如果你想在字串的開頭搜尋,那麼可以使用^。

來看下例, importre str="HelloPythonProgramming" sobj=re.search(r"^programming",str,re.I) print(sobj.group())#nomatchisfound sobj=re.search(r"^hello",str,re.I) print(sobj.group())#matching:Hello 這裡,^的意思是隻在字串的開頭進行搜尋,假如開頭不匹配的話,就返回None,而不管字串後續中有沒有再匹配到。

在字串結尾搜尋 你也可以在給定字串的末尾搜尋,通過在模式後面加$來限定。

來看這個例子, importre str="HelloPythonProgramming" sobj=re.search(r"programming$",str,re.I) print(sobj.group())#matching:Programming sobj=re.search(r"hello$",str,re.I) print(sobj.group())#nomatchfound 編譯正規表示式 Python中的正規表示式在編譯時將轉換為模式,這些模式實際上是包含不同功能的模式物件,以執行不同的任務,包括搜尋,匹配和替換等。

編譯模式後,你可以稍後在程式中使用該模式。

使用預編譯的模式 在下面的例子中,被編譯的模式r"\d"意思是在字串中的第一個數字。

當該模式後續跟search一起使用的時候,它搜尋輸入字串中的一個數字;同樣的,你也可以用這個模式跟match搭配來找到給定字串中的匹配。

importre compPat=re.compile(r"(\d)") sobj=compPat.search("Lalalala123") print(mobj.group()) mobj=compPat.match("234Lalalala123456789") print(mobj.group()) 1 2 標誌位flags 你可以使用標誌位flags來改變正規表示式的行為。

在正則函式中,標誌位是可選項。

你可以通過兩種不同的方式來使用標誌,即使用關鍵字flags併為其分配標誌值或直接寫入標誌位的值。

你可以設定多個標誌位,這可以通過使用按位或運算|符來完成。

下表列出了正規表示式的一些常用標誌, 標誌位 說明 re.I 在匹配時忽略字串和模式的大小寫 re.L 匹配{\w\W\b\B}跟本地語言相關。

不推薦使用 re.M $匹配行末尾,而不是字串末尾,同理^匹配行開頭而不是字串開頭 re.S .匹配任何字元,也包括新的一行 re.U 使用Unicode字符集 re.X 忽略各種空格以及以#開頭的註釋,這使得長匹配模式可以分行來寫,提高了可讀性 使用多個標誌位 我們用下面的程式碼來演示如何來使用多個標誌位來修改正規表示式的行為結果,它們是通過或邏輯符|分開的。

importre s=re.search("L","Hello") print(s) #Output:None,Listherebutinsmallletterandwedidn'tuseflags s=re.search("L","Hello",re.I) print(s) #Output:1 s=re.search("L","^Hello",re.I|re.M) print(s) #Output:1,searchingwillbemadefromthestartoflineandcaseisignored 檢查允許的字元 你可以檢查一個特定的字串中是否是否含有特性的字符集。

定義函式並檢查允許的字元 在下面的例子中,我們定義了一個函式,並使用預編譯模式來檢查某些字元是否在給定的字串中, importre defcheck(str): s=re.compile(r'[^A-Z]') str=s.search(str) returnnotbool(str) print(check("HELLOPYTHON")) #輸出:True print(check("hellopython")) #輸出:False 在此函式中,模式r'[^A-Z]'被編譯並使用它來搜尋在呼叫名為check的函式中傳遞的字串。

此函式實際檢查傳遞的字串是否包含大寫字母。

類似地,你可以看到當你傳遞的字串中只含有小寫字母時返回False。

搜尋和替換 re模組提供了一個sub函式來替換給定字串string中出現的所有符合pattern匹配模式的情況,用來替換的字串是repl。

你可以通過count關鍵字引數指定最大的替換次數,假如count沒有給定的話,那就沒有最大替換次數限制。

sub函式返回了一個新的字串。

以下是sub函式的語法, re.sub(pattern,repl,string,count=0) sub函式舉例 下面的例子中,sub函式將整個字串用新的字串替換掉了, importre s="Playing4hoursaday" obj=re.sub(r'^.*$',"Working",s) print(obj) Working 這裡,模式r'^.*$中,^和$意思是從開頭到結尾,.*意思是匹配字串中的任意字元,它們結合起來就是匹配從開頭到結尾的任意字元。

"Working"將來替換整個字串s。

使用sub函式來刪除字串中的所有數字 下面的例子中,使用sub函式來刪除給定字串中的數字,你需要用\d來匹配數字。

importre s="768Working2343789five234656hours3244646a345day" obj=re.sub(r'\d',"",s) print(obj) Workingfivehoursaday 類似的,你可以來刪除字串中的字母,用\D來匹配所有的字母。

importre s="768Working2343789five234656hours3244646a345day" obj=re.sub(r'\D',"",s) print(obj) 76823437892346563244646345 findall()函式 Thefindall函式返回與模式匹配的所有字串組成的列表。

search和findall函式之間的區別在於findall查詢所有匹配項,而search只查詢第一個匹配項。

findall函式查詢出非重疊的匹配並將其組成列表來返回。

以下是findall函式的語法, findall(pattern,string,flags) 這裡,pattern是正則表達,string是給定字串,flags是前面已經介紹的標誌位。

查詢所有的非重疊的匹配 下面的例子中,findall找出所有非重疊的匹配, importre str="Working6hoursaday.Studying4hoursaday." mobj=re.findall(r'[0-9]',str) print(mobj) ['6','4'] r'[0-9]'的意思是匹配所有的數字,最終結果6,4以列表的形式被返回賦值給mobj。

findall查詢檔案的內容 你還可以使用findall在檔案中查詢。

當你使用findall來查詢檔案內容時,它將返回檔案中所有匹配的字串的列表,我們可以使用檔案的read()方法來讀取檔案中的全部內容,因此你不必來使用迴圈。

下面我們具體通過例子來解釋, importre file=open('asd.txt','r') mobj=re.findall(r'arg.',file.read()) print(mobj) file.close() ['arg,','arg,','arg,','argv','argv','argv'] 本例中,檔案通過只讀模式開啟,然後匹配模式r'arg.'用來匹配四個字元中其中前三個字元是arg而第四個字元任意的情況。

所有的匹配字串通過列表來返回結果。

finditer()函式 finditer函式可用於在字串中查詢正規表示式模式並將匹配的字串以及字串的位置返回。

以下是finditer函式的語法: finditer(pattern,string,flags) 遍歷所有的匹配 findall和finditer之間唯一的區別是finditer返回索引以及匹配的字串。

在下面的程式碼中,finditer用於查詢匹配字串的位置,而後通過for迴圈來在遍歷所有的匹配(匹配字串)。

importre str="Working6hoursaday.Studying4hoursaday." pat=r'[0-9]' formobjinre.finditer(pat,str): s=mobj.start() e=mobj.end() g=mobj.group() print('{}foundatlocation[{},{}]'.format(g,s,e)) 6foundatlocation[8,9] 4foundatlocation[32,33] split()函式 split函式用於拆分字串,以下是split函式的語法, split(patter,string,maxsplit=0,flags=0) 這裡maxsplit是最多的拆分次數,假如能夠拆分的次數大於maxsplit那麼剩餘的字串將作為列表中的最後一個元素。

maxsplit的預設值是0,意思是可以無限拆分。

拆分一個字串 我們可以通過split來拆分字串,下面的例子中,字串根據給定的模式以及最大拆分的數量來拆分。

importre str="Birdsflyhighintheskyforever" mobj=re.split('\s+',str,5) print(mobj) ['Birds','fly','high','in','the','skyforever'] 本例中,模式\s用來匹配所有的空白字元,它等效於各種空白字元的集合,包括空格,製表符,回車等,具體如[\t\n\r\f\v]。

所以你可以通過它將各個拆分開來。

這裡的最大拆分次數是5,所以結果列表中有6個元素,最後一個元素是最後一次拆分後剩下的所有的字串。

Basicpatternsofre的基本模式 正規表示式可以指定與給定字串進行比較的模式。

以下是正規表示式的基本模式, 模式 描述 ^ 在字串開頭匹配 $ 在字串的結尾處匹配 . 匹配任意一個字元(不包括換行符) [...] 匹配括號內的單個字元 [^...] 匹配不在括號中的單個字元 * 給定字串中出現0次或更多次 + 給定字串中出現1次或多次前面的 ? 給定字串中出現0次或1次 {n} 匹配給定字串中出現次數為n {n,} 匹配給定字串中出現次數為n次或多次 {n,m} 匹配給定字串中的出現次數為至少n個,最多m個 `a b` (re) 此模式用於對正規表示式進行分組,它將記住匹配的文字,也叫反身引入 (?imx) 它將暫時在RE上切換i或m或x。

使用括號時,只會影響括號區域 (?-imx) 它會暫時關閉RE中的i或m或x。

使用括號時,只會影響括號區域 (?:re) 此模式用於對正規表示式進行分組,但不會記住匹配的文字 (?imx:re) 它將臨時在括號內的RE或i或RE中切換 (?-imx:re) 它會在括號內暫時切換i或m或x中的RE (?#...) 這是一個評論 (?=re) 它用於通過使用模式指定位置。

它沒有任何範圍 (?!re) 它用於通過使用模式否定來指定位置。

它沒有任何範圍 (?>re) 此模式用於匹配獨立模式 \w 此模式用於匹配單詞 \W 此模式用於匹配非單詞 \s 它將匹配空格。

\s等於[\t\n\r\f] \S 它將匹配非空格 \d \d等於[0-9]。

它匹配字串中的數字 \D 匹配非數字 \A 匹配字串的開頭 \Z 匹配字串的結尾。

如果有任何換行符,它將在換行符之前匹配 \z 匹配字串的結尾 \G \G用於匹配最後一次匹配結束的點 \b 匹配在開頭或者結尾的空字元 \B 匹配不在開頭或者結尾的空字元 \n,\t,etc. \n用於匹配換行符,\t將匹配分隔符 \1...\9 匹配第n個子表示式(已分組) \10 \10通常匹配第n個子表示式(已分組),如果匹配已經完成。

如果匹配尚未完成\10將提供字元程式碼的八進位制表示 重複情形 下面的列表中列出了匹配當中的重複情形以及它們的具體說明。

舉例 說明 ab? 匹配a或者ab ab* 匹配a或者a後面接任意個b,比如ab,abb… ab+ 匹配a以及至少一個b \d{2} 匹配兩個數字 \d{2,} 匹配兩個或多個數字 \d{2,4} 匹配2到4個數字 非貪婪匹配 在正規表示式在,重複一般意義上都是貪婪的,也就是它試圖儘量多的去匹配最大的重複。

限定符*,+及?是貪婪限定符,當你使用*時,它會進行貪婪匹配,會匹配字串中儘量多的字元。

比如下面的例子, importre mobj=re.match(r'.*',"Birdsflyhighinsky") print(mobj.group()) Birdsflyhighinthesky 你能看出來,整個字串都被匹配了。

當你一起使用?和.+時,就得到了一個非貪婪匹配模式.+?,它會盡量少的去匹配字串中的內容。

importre mobj=re.match(r'.*',"Birdsflyhighinsky") print(mobj.group()) 結果就只有一個字元, B 正規表示式中的特殊字元和轉義 re模組中的特殊字元以\為開始。

比如,\A匹配字串的開頭。

在上面的列表當中,我們已經具體介紹了這些特殊字元,我們將用例子來解釋它們的具體用法。

importre str="Birdsflyhighinthesky" #\A mobj=re.match(r'\Ab',str,re.I)#OUTPUT:B,here\Awillmatchatbeginningonly. #\d mobj=re.match(r'\d',"4birdsareflying")#OUTPUT:4 #\s mobj=re.split('\s+',"birdsflyhighinthesky",1)#OUTPUT:['Birds','fly'] 轉義函式escape escape函式用來轉義字串中的字元,ASCII字母、數字以及下劃線_不會被轉義。

下面是escape函式的語法, escape(pattern) 在下面的例子中,字串www.python.com被傳入到escape函式,其中的.是一個特殊的元字元,將會被轉義成\.。

print(re.escape('www.python.com')) www\.python\.com 一般而言,特殊的元字元會通過在前面加反斜槓\來轉義。

轉義特殊字元 比如說像括號[和]這樣的字元,在正規表示式中具有特殊的意義。

我們先看一個例子, importre mobj=re.search(r'[a]','[a]b') print(mobj.group()) a 這裡,很明顯,[和]沒有被匹配到,因為它們在正規表示式中的含義是匹配該括號裡面的一個字元。

假如你想要匹配[和]的話,你需要在它們前面加\。

importre mobj=re.search(r'\[a\]','[a]b') print(mobj.group()) [a]b group()方法 group方法用來返回一個或多個被查詢到的匹配的子匹配字串,它的引用方法如下, group(index) Ifyouhaveasingleargumentingroupfunction,theresultwillbeasinglestringbutwhenyouhavemorethanonearguments,thentheresultwillbeatuple(containingoneitemperargument). Whenthereisnoargument,bydefaultargumentwillbezeroanditwillreturntheentirematch. WhentheargumentgroupNiszero,thereturnvaluewillbeentirematchingstring. WhenyouspecifythegroupnumberorargumentasanegativevalueoravaluelargerthanthenumberofgroupsinpatternthenIndexErrorexceptionwilloccur. Considerthecodebelowinwhichthereisnoargumentingroupfunctionwhichisequivalenttogroup(0). importre str="Working6hoursaday" mobj=re.match(r'^.*',str) print(mobj.group()) Working6hoursaday Heregroup()isusedandyouhavetheentirematchedstring. Pickingpartsofmatchingtexts Inthefollowingexample,groupfunctionisusedwithargumentstopickupmatchinggroups: importre a=re.compile('(p(q)r)s') b=a.match('pqrs') print(b.group(0)) print(b.group(1)) print(b.group(2)) pqrs pqr q Heregroup(0)returnstheentirematch.group(1)willreturnthefirstmatchwhichispqrandgroup(2)willreturnthesecondmatchwhichisq. Namedgroups Usingnamedgroupsyoucancreateacapturinggroup.Thisgroupcanbereferredbythenamethen.Considertheexamplebelow: importre mobj=re.search(r'Hi(?P\w+)','HiRoger') print(mobj.group('name')) Roger Non-capturinggroups Non-capturinggroupcanbecreatedusing?:.Non-capturinggroupisusedwhenyoudonotwantthecontentofthegroup. importre mobj=re.match("(?:[pqr])+","pqr") print(mobj.groups()) () Python庫/模組教程 reportthisad xx



請為這篇文章評分?