【每天幾分鐘,從零入門python編程的世界!】
正則表達式英文是Regular Expression,各種程式語言中都是把它簡寫成Regex,或者Regexp或者re。
這節我們學習如何在正則表達式中實現可選規則。
●用小括號和pipe(豎線|)實現每一個可選項
例1:
現在假設我們有一個應答機器人,接到了很多很多用戶的留言,這些留言中包括用戶自己的姓名、聯繫電話等信息。我們把這些留言都匯集在一起,這些留言信息就相當於一個很長很長的字符串。現在假如說我們在包含海量姓名的這個字符串中尋找特定的姓名,我們如何實現呢?
我們通過代碼來說明:
上面的代碼說明:
我們在message這個字符串中尋找特定的姓名,
r'Jack( Ma| Chen| Zhou| Liu)'這個正則表達式的模式,表示要找的字符串是:「以Jack開頭,後面跟一個空格,空格後面是Ma、Chen、Zhou、Liu這四個中的任意一個」的這種格式的字符串。也就是說,從message中找的字符串就是跟Jack Ma、Jack Chen、Jack Zhou、Jack Liu這四個中任意一個匹配的字符串。
在這裡,可選的規則用小括號括起來,( Ma| Chen| Zhou| Liu)就是表示可選的規則,括號裡面,豎線之前的字符串就表示每一個可選項。
我們把r'Jack( Ma| Chen| Zhou| Liu)'叫做正則表達式的規則文本,我們知道正則表達式是用來尋找字符串的模式或者規則,那麼r'Jack( Ma| Chen| Zhou| Liu)'就是這個規則或者說模式的具體表達形式。如果是第一次接觸編程或者正則表達式的小夥伴,有沒有覺得有點繞?多理解下正則表達式的概念就清楚了。
上面代碼運行結果:
message這個字符串中還有Jack Chen、Jack Zhou、Jack Liu這幾個字符串都是匹配正則表達式的,為什麼結果列印出來,只有一個Jack Ma?
因為search()函數是找到並返回符合條件的第一個字符串,所以只返回了Jack Ma。
以上代碼最後一句,我們為什麼列印的是mo.group(),而不是mo?
因為search()函數,還有match()函數,返回的都是一個匹配正則表達式的對象,我們mo列印一下,就能看到它是一個對象,如下:
運行結果:
我們看到mo列印出來是一個對象。
所以mo.group()返回的才是匹配正則表達式的字符串,這一點要知道。
●用括號和問號實現可選規則
例2:假如有一個人名叫Monkey D Lufy,實際上現實中,老外的名字寫出來,一般都是只寫firstname和lastname,middlename一般是不寫的,只有非常親近的人,才能知道他的middlename,那麼這個D就是Monkey D Lufy這個人的middlename。
現在假如說我們是海軍,從各種渠道收集到了海賊王路飛這個人給別人留言或者留名的信息,這個信息以字符串的形式保存在message變量中。假如說我們也不知道這個message字符串中,路飛的名字中帶不帶D這個middlename。反正我們不管他的名字中有沒有D,只要有Monkey Lufy這兩個名,我們就確定是路飛本人。我們現在要用正則表達式來表示這個規則,也就是說,我們從message中找到的字符串,不管是Monkey Lufy,還是Monkey D Lufy,都是符合規則的。那麼這個正則表達式的規則如何寫呢?
代碼如下:
運行結果:
代碼說明:
在正則表達式的模式文本r'Monkey (D )?lufy'中,(D )?就表示D後面帶一個空格是可選的。
問號?表示0個或1個,即可以有也可以沒有。
所以r'Monkey (D )?lufy',就表示Monkey後面可以有1個D加空格,然後再跟Lufy,或者Monkey後面可以是0個D加空格,再跟Lufy。
在這裡,把規則中可選的部分用小括號括起來,然後後面跟一個問號,就表示這一部分是可選的、可以有也可以沒有。
從上面代碼的message中的Monkey D Lufy,也是符合我們寫的正則表達式規則的,所以被我們找到了然後列印了出來。
我是時問新,歡迎關注我。跟我一起從零開始學習Python,每天花一點時間,開啟python編程新世界的大門,領略新的風光,讓人生多一種可能!