Regular Expression — 正規表示式在Python的用法 - Medium

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

正規表示式(Regular Expression可簡稱為regex)是文字模式的表示方法,其功能十分強大,可用於處理字串的強大工具。

換句話說,是用字串定義出一組樣式, ... GetunlimitedaccessOpeninappHomeNotificationsListsStoriesWritePublishedinPythonEverywhere-fromBeginnertoAdvancedRegularExpression—正規表示式在Python的用法ChurchoftheGoodShepherd,LakeTekapo,NewZealand,photobySeanYeh您是否曾經有下面的經驗?例如您需要尋找電腦中某個使用excel製作的報表卻忘記該檔案儲存在哪個資料夾裡面,在茫茫的檔案中要花很多時間才能找到。

這時候你可能會想到在檔案總管裡面使用萬用字元「*」模式尋找所有副檔名為xlsx的excel檔案(搜尋:*.xlsx)。

又如您需要尋找某個網頁中以某個字開頭的句子,而該頁面並沒有提供搜尋功能,這時候您是否會使用『Control+F』鍵,尋找相關字串開頭的句子?其實還有一種更快的方式可以幫助您找到想要的資料。

那就是接下來要說明的正規表示式。

何謂正規表示式正規表示式(RegularExpression可簡稱為regex)是文字模式的表示方法,其功能十分強大,可用於處理字串的強大工具。

換句話說,是用字串定義出一組樣式,來搜尋符合這個樣式的字串,如果配對match到了,就會顯示出結果。

例如想要找出任何一個0到9的數字,可以使用『\\d』來表示,如果要找出一個三位數數字,則可以使用『\\d\\d\\d』來表示。

依此類推,如果要找出一組三個數字加四個數字中間連一個『-』符號的電話號碼(如:1234–5566),可以依照同樣的方式透過『\\d\\d\\d-\\d\\d\\d\\d』來表示。

這就是一種正規表示式。

如何使用正規表示式在Python中有一個re模組,在這個模組中包含了所有的正規表示式的函式。

在開始使用正規表示式前,需要匯入re模組。

匯入Re模組由於re模組在安裝Python的時候已經在裡面,這裏只需要單純的匯入python檔案就可以使用了。

importre建立Regex物件並比對當re模組匯入後,就可以在re後面加上逗點進行各種操作。

例如若想從一個檔案中找出符合某種樣式的字串(以He字串為例),可以透過re模組,並指定搜尋的字串樣式,Python就會從檔案中找出符合該樣式的字串,並加以處理。

其具體的作法是,需要先定義一個想要比對的「字串模式」,以及要被比對的「對象字串」。

簡單說,就像是這樣:result=re.match("He","HelloWorld")在這裡,「He」是字串模式,「HelloWorld」是對象字串。

透過上面的程式碼,就會找到字串裡面具有「He」的部分。

importreresult=re.match("He","HelloWorld")ifnotresult:print("Keywordnotfound")print("Match!")以上面的程式碼為例,若執行程式碼,我們將可以得到「Match!」的結果。

用match()比對前面提到,透過match()可以取出「字串模式」作為比對項目,來對「對象字串」進行比對。

如下面的這個程式碼,基本上與前面的例子一樣,可以比對message對象字串中是否存在著『請來』這個字串模式。

importremessage='請來電洽詢(02)2555-1011,或致電2555-9999'mo=re.match('請來',message)ifmo:print(mo.group())執行結果,出現「請來」。

用compile()編譯除了上面的方式外,你也可以事先透過compile()來編譯比對模式「patternobject」,re.compile()會將其轉換成編譯形式的表達式,並且將這個模式保存下來,以便日後重複使用。

這個過程並非絕對必要,但透過這樣編譯的方式可以提昇程式比對匹配的速度。

根據Python文件的說明,下面的兩的兩個程式碼是一樣的。

(https://docs.python.org/2/library/re.html)prog=re.compile(pattern)result=prog.match(string)re.compile(pattern)會傳回一個物件,我們把它指定給prog變數後,就可以透過prog.match(string)來尋找是否有符合string的字串。

#它等同於:result=re.match(pattern,string)因此我們可以透過compile()來改寫這個例子:importremessage='請來電洽詢(02)2555-1011,或致電2555-9999'mo=re.match('請來',message)ifmo:print(mo.group())上面的例子可以改寫如下:importrepattern=re.compile('請來')message='請來電洽詢(02)2555-1011,或致電2555-9999'mo=pattern.match(message)ifmo:print(mo.group())執行結果如下:用match()比對的問題前面的例子使用match()來進行字串比對,但這裡有一個問題,就是若想要比對「字串中間」的字,例如我們如果用這支程式尋找「洽詢」字串,明明我們看到字串就在裡面,match()卻無法找到了。

importremessage='請來電洽詢(02)2555-1011,或致電2555-9999'mo=re.match('洽詢',message)ifmo:print(mo.group())在這種狀況下match()不會傳回任何東西,也就找不到任何字串。

不到任何字串該如何修改這支程式?因為「.*」符號表示比對尋找任何數量的字元(.代表單一字元,*代表任何數數量,「.*」代表任何數量的字元)。

我們可以在「洽詢」的前面加上「.*」符號,就可以匹配到洽詢這個字串。

importremessage='請來電洽詢(02)2555-1011,或致電2555-9999'mo=re.match('.*洽詢',message)ifmo:print(mo.group())由於.代表單一字元,*代表任何數數量,「.*」代表任何數量的字元。

因此執行後,可以找到「請來電洽詢」字樣(包含洽詢前面的任何字元)。

其他比較方法除了match外,還有其他的比較方式:searchfindallsplitsub以下分別介紹這幾種方式的使用方法。

search()search()方法可尋找傳入的字串,搜尋比對符合該正規表示式的第一個項目。

如果找到了匹配的項目則會返回一個match物件,反之如果沒有發現匹配的項目,則會返回None。

#使用search()的優點:使用search()方法有一個好處,我們在前面的程式裡面所使用的「.*」符號就不需要。

因此,上面的程式可以改成:importremessage='請來電洽詢(02)2555-1011,或致電2555-9999'mo=re.search('洽詢',message)ifmo:print(mo.group())#group()方法可以利用match物件中的group()方法,返回被搜尋字串中實際符合的文字。

importremessage='請來電洽詢(02)2555-1011,或致電2555-9999'phoneNumber=re.compile(r'(\(\d\d)\)\d\d\d\d-\d\d\d\d')mo=phoneNumber.search(message)print(mo.group())結果就會把message字串中符合phoneNumber的文字顯示出來。

findall()到目前為止我們使用的方法,只能尋找出一組符合條件的結果。

如果您希望找出某個字母在目標字串中出現幾次的話,就可以讓findall()來協助您完成這項任務。

下面的例子可以幫你找出字串中有兩個「電」字。

importremessage='請來電洽詢(02)2555-1011,或致電2555-9999'mo=re.findall('電',message)print(mo)執行結果如下:split()spilt()可以將一個字串分割成一個List串列。

下面的例子可以透過spilt將source字串的內容依照逗點(,)位置,分割成一串串列[‘May','John','Lin','Frank','Stien']。

importresource="May,John,Lin,Frank,Stien"m=re.split(',',source)print(m)執行結果如下:sub()取代字串sub()可以取代字串。

在下面的例子中『?』將會取代句子中的『n』importresource="Thisismyname"m=re.sub('n','?',source)print(m)執行結果如下:注意:match()只會在模式位於來源的『開頭』時才會生效,使用時需要注意。

若使用search()的話,不管模式在任何地方都會生效。

不需要使用(.*)萬用字元。

如何定義正規表示式特殊字元下面列出正規表示式中常用的特殊符號和字元:上面是正規表示式中常用的特殊符號和字元,我們該如何使用?如果想要比對出字串中所有的數字,可以採用下面的方式:importremessage=比對的字串mo=re.findall('\d',message)print(mo)其中『message=比對的字串』,代表的是一組字串,若直接執行上面的程式應該不會比對出任何數字,大家可以在等號右邊放入自己的內容後再測試。

如果想要比對出字串中所有的數字、英文字母或底線,可以採用\w的方式:importremessage=比對的字串mo=re.findall('\w',message)print(mo)因為\w代表任何字母、數字或底線的英數字元,它的效果等於[A-Za-z0-9_]。

如果想要比對出字串中所有的空白,可以採用\s,它代表空格、定位符號或換行符號,等效於[\f\n\r\t\v]下面的方式:importremessage=比對的字串mo=re.findall('\s',message)print(mo)結語正規表示式功能強大,如果學會用正規表示式處理問題的話,就意味著可以用較少的程式碼完成一件事情。

一個別人可能需要3000個步驟、花很多時間處理才得以搞定的問題,透過正規表示式的你可能只需要幾行程式碼、幾個步驟就解決了。

然而它並不是Python所獨有的,您一樣可以在其他程式語言裡面,看到正規表示式的痕跡。

在學習程式的過程中應該要好好的學習正規表示式,如此可以讓你的程式碼變得更為簡潔更快速。

--MorefromPythonEverywhere-fromBeginnertoAdvancedThisplaceisAllaboutPython.FromBeginnertoAdvancedprograming,byusingPython,youcandoanythingyouimagine.ReadmorefromPythonEverywhere-fromBeginnertoAdvancedAboutHelpTermsPrivacyGettheMediumappGetstartedSeanYeh362Followers#Taipei,InternetDigitalAdvertising「樂於發現與分享,才是最大贏家」FollowMorefromMediumMayuriKaleTuplesFunctioninPythonMohitNakhaleIterators&GeneratorsinPythonShaliniMuraliVariablesinPythonShubhamDubeyinAlmaBetterPythoninput()andraw_input()function.HelpStatusWritersBlogCareersPrivacyTermsAboutKnowable



請為這篇文章評分?