大家好,今天我們一起學習以下Python中的「正則表達式」,說到正則表達式,大家可能比較陌生,不過我卻要告訴你,你每天都在使用正則表達式,不要不承認,就問你最常見的,瀏覽器每天用不?淘寶經常逛不?你在搜索框裡輸入幾個文字,按下回車,就出來大量結果,你想想這是怎麼辦到的,是正則表達式,可以好不誇張的講,沒有正則表達式,就沒有搜尋引擎。估計不少人還是雲裡霧裡,OK,大家先看看下面這兩張網頁截圖。
看看畫紅線的部分,為什麼你輸入什麼文字,網址裡面(也就是藍框所圈住部分)就會出現什麼文字。我現在告訴你,你之所以能在搜索框裡輸入幾個文字,按下回車,就出來大量結果,是因為瀏覽器已經幫你生成了正則表達式,也就是藍框所圈住的那一部分內容。當然搜尋引擎絕不止正則表達式這麼簡單,但正則表達式無疑佔據了最核心的部位。
說了這麼多,那什麼是正則表達式呢?百度百科中給了這樣一個解釋,「正則表達式,又稱規則表達式(英語:Regular Expression,在代碼中常簡寫為regex、regexp或re),是計算機科學的一個概念。正則表達式通常被用來檢索、替換那些符合某個模式(規則)的文本」,那使用正則表達式的目的是什麼呢?百度百科中只寫了兩句話:
1. 給定的字符串是否符合正則表達式的過濾邏輯(稱作「匹配」);
2. 可以通過正則表達式,從字符串中獲取我們想要的特定部分。
大家可以簡單的理解為兩點:search和match。OK,了解了正則表達式的概念和作用,我們趕緊進入Python的學習吧!正則表達式不是Python獨有的武器,但Python中的正則表達式無疑是最簡單卻又最強大的。在Python中使用正則表達式,需要導入re模塊,如下圖所示。
先給出一個小例子,如下圖所示,怎麼樣才能在列表list1中找出以py開頭的字串呢?
有小夥伴想出了一個法子,用的是for/in語句和if/else語句,如下圖。
OK,還有其他方法嗎,有小夥伴受上面代碼啟發,寫了個列表生成式。
也挺簡單是不,似乎這些地方用不著正則表達式,那我現在給出下面一個字符串,要求把字符串中所有的數字都提取出來,比如字符串'ab23fd5g67',我們需要提取出23、5、67,注意不能把數字分開哈!該怎麼辦,小夥伴們好好想想,再想用上面的方法實現就比較困難了吧!下面就該正則表達式出場了。
完美實現,是不是對正則表達式充滿興趣了呢!OK,接下來我們就依次學習一下re模塊的各個方法吧。
match方法用於嘗試從字符串的起始位置匹配一個正則表達式,如果匹配成功則返回一個match對象,如果沒有匹配成功,就返回None。pattern指的是匹配的正則表達式,string指的是用於匹配的字符串,flags是標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
小夥伴急了,等等,蘇蘇,你還沒告訴我怎麼書寫一個正則表達式呢?
不要急,我們接下來就以match方法為測試對象教大家書寫一個正則表達式。首先我給出一個簡單的字符串'hello world',大家看什麼樣的正則表達式能匹配它,我先給出一個,大家請看。
先解釋一下,Match對象的group(0)用於返回匹配的整個字符串,span()方法用於以元祖形式返回匹配的起始位置和結束位置。
大家可以看到成功匹配了,這時有人會問了,不是說要寫正則表達式嗎?你寫個'hello world'幹嘛,我告訴你'hello world'也是一個正則表達式,只不過它只能匹配字符串'hello world'或以'hello world'開頭的字符串而已。OK,大家再看看如何匹配下面的三個字符串。
這時用上面的小把戲就沒用了,我總不能再寫三個一模一樣的字符串來匹配吧,大家可以看到三個字符串的開頭結尾都一樣,就中間字符不一樣,那我們可以這樣寫。
大家可以看出正則表達式m成功匹配出上面三個字符串,為什麼它可以做到呢,我們分析一下,正則表達式為r'T[io]+m',最前面的T和最後面的m就不講了,大家一看便知,我們重點講一下中間的 [io]+,[io]表示匹配的字符可以是中括號中的任意一個i或o,而後面跟著的+號表示可以對[io]匹配一次或多次。所以只要滿足這一條件的字符串都是可以被匹配的。
OK,接下來我想寫一個正則表達式,用來匹配僅以數字組成的字符串,大家看怎麼實現。
解釋一下:符號^匹配行首,符合$匹配行尾,中括號裡的內容表示字符串中所能包括的字符,不過,這樣寫是不是有點笨拙,我要是要求寫一個能匹配所有僅以字母組成的字符串的正則表達式,你還不得把26個字母寫全了,加上大寫,一共52個,多費勁。大家不必擔心,你能想到的,Python早就想到了,Python還支持這樣寫。
很方便吧,其實還有更簡單的,即使用正則表達式中的特殊字符,(~ ̄▽ ̄)~,說到特殊字符,其實上面已經講了一點了,^、$、- 都是特殊字符。不過特殊字符絕不止這麼點,接下來,我們就一起學習一下吧!請看Python文檔。
『.』用於匹配除換行符(\n)之外的所有字符。『^』用於匹配字符串的開始,即行首。『$』用於匹配字符串的末尾(末尾如果有換行符\n,就匹配\n前面的那個字符),即行尾。『*』用於將前面的模式匹配0次或多次(貪婪模式,即儘可能多的匹配)『+』用於將前面的模式匹配1次或多次(貪婪模式)『?』用於將前面的模式匹配0次或1次(貪婪模式)『*?,+?,??』即上面三種特殊字符的非貪婪模式(儘可能少的匹配)。『{m,n}』用於將前面的模式匹配m次到n次(貪婪模式),即最小匹配m次,最大匹配n次。『{m,n}?』即上面『{m,n}』的非貪婪版本。『\\』:'\'是轉義字符,在特殊字符前面加上\,特殊字符就失去了其所代表的含義,比如\+就僅僅代表加號+本身。『[]』用於標示一組字符,如果^是第一個字符,則標示的是一個補集。比如[0-9]表示所有的數字,[^0-9]表示除了數字外的字符。『|』比如A|B用於匹配A或B。『(...)』用於匹配括號中的模式,可以在字符串中檢索或匹配我們所需要的內容。
再說一下,字符串的前面加上字母r就表示raw string,也叫原始字符串。為什麼要有原始字符串呢?舉個例子,我的D盤下有個newProject的文件夾,而在我的某個程序中正好需要這個文件夾的路徑,我們在Python中寫一下,大家看看效果。
這不是我想要的結果啊,為什麼會這樣,原來Python把路徑中的\n當成了換行符,那該怎麼辦呢?前面加個r試試。
怎麼樣,可以吧,當然你也可以用轉義字符\來實現同樣的功能,在\n前面加上一個反斜槓\,\n就不代表換行符了,僅僅是字符『\n』。
Python中還有其他轉義字符,在這兒再一併介紹下。
\A:表示從字符串的開始處匹配\Z:表示從字符串的結束處匹配,如果存在換行,只匹配到換行前的結束字符串。\b:匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'py\b' 可以匹配"python" 中的 'py',但不能匹配 "openpyxl" 中的 'py'。\B:匹配非單詞邊界。 'py\b' 可以匹配"openpyxl" 中的 'py',但不能匹配"python" 中的 'py'。\d:匹配任意數字,等價於 [0-9]。\D:匹配任意非數字字符,等價於 [^\d]。\s:匹配任意空白字符,等價於 [\t\n\r\f]。\S:匹配任意非空白字符,等價於 [^\s]。\w:匹配任意字母數字及下劃線,等價於[a-zA-Z0-9_]。\W:匹配任意非字母數字及下劃線,等價於[^\w]\\:匹配原義的反斜槓\。
OK,今天的內容差不多了,上面講的特殊字符大家再多複習複習,我們在下次講解中結合re模塊的方法再具體進行闡述。謝謝大家的關注和閱讀,還有更多的精彩美文,記得第一時間來閱讀哈!