正則表達式(三)

前言

  這兩天在讀刻意練習,這本書寫的很好,裏面有一段是這樣寫的:“我深深地困在,當前的處境中。四面高牆,定義了我的空間格局。我就在這裏,生活了很多年,而且可能繼續生活下去。我要盡全力將其打破,觸及更加廣闊的世界。”

這段話的描寫很符合我現在的處境,研究生的生活在外人看來很光鮮,其實不然。我們就這樣困在三維空間的一個小小局部裏,而要離開這個位置,就要採取行動,而且是持續地行動。那麼,我現在能做的就是夯實基礎,堅持寫作,用自身的力量打破這高牆,即使有一天沒有做到,那也會讓這高牆有一絲裂紋。

正文

我喜歡用實例來學習知識點,這樣知識點就從抽象概念變得具體,一起來看看今天的例子吧。

例1:正則表達式忽略大小寫

import re

language= 'pythonC#\nJavaPHP'

r= re.findall('C#',language)#Python在正則表達式重複的表示出來  ;大小寫字符

# 正則表達式忽略大小寫

r1= re.findall('c#.{1}',language,re.I|re.S)#re.S表示匹配所有字符,包括\n  |表示且關係;re.I忽略字母大小寫

#'c#.{1}'首先匹配c#,再匹配任意字符

print(r)

print(r1)


這段代碼中,findall函數還可以傳入參數模式這個變量。當傳入re.I時,正則表達式忽略大小寫;當字符串中出現\n時,如果還要匹配出\n,可以看到,不僅正則表達式裏面用到「. 」,但通過前面學習,「. 」表示匹配除\n的所有字符的概括集,所以,還需要在參數模式裏再加上re.S,它表示匹配所有字符,其中|表示且關係。

例2:查找後替換

import re

language= 'pythonC#JavaC#PHPC#'

def convert(value):

    matched= value.group()#用group()函數取出對象value的值

    return '!!'+ matched+'!!'

r= re.sub('C#','GO',language,0)#0表示匹配無限匹配下去,最大匹配次數

r1= re.sub('C#',convert,language)

language= language.replace('C#','GO')#沒有實現替換,需要新生成一個結果

print(r)

print(r1)

print(language)


對於這周應用場景,實現的方法很多。比如,可以用Python的內置函數.replace(),也可以用for遍歷後再替換,或者用正則的表達式的函數re.sub()函數,下面就着重講一下sub函數,它的第二個參數可以是函數,比如上面代碼。

例3:re.sub函數

import re

s= 'A8C3721D86'

# s = 'A83C72D1D8E67'

def convert(value):

    matched= value.group()

if int(matched)>= 6:

        return '9'

    else:

        return '0'

r= re.sub('\d',convert,s)

print(r)


這裏,將正則表達式要替換的部分用函數表示,在函數中加入條件判斷,最終可以實現。

用函數作爲替換值,好處很多的,比如,將給定的字符串變一下,其中數字有1位,也有2位,這時可以根據需求,設定條件替換掉數字。

例4:re.match函數和re.search函數

import re

s= 'A83C72D1D8E67'

#從字母串首字母開始,如果沒找到,將會返回none

r= re.match('\d',s)

print(r)

#搜索整個字符串,直到找到滿足正則表達式的第一個字符串,返回結果,不會繼續往下搜索

r1= re.search('\d',s)

print(r1.group())

print(r1.span())#打印出搜索到第一個字符串的位置

r2= re.findall('\d',s)

print(r2)

#返回結果


正則表達式中常用的函數是re.findall(),此外還有的兩個函數就是re.match()和re.search()。

re.match()函數,從字符串首字母開始查找,如果沒有找到正則表達式,就會返回None。

re.search()函數,搜索整個字符串,直到找到滿足正則表達式的第一個字符串,返回結果,但不會繼續往下搜索。

代碼中列出了三種函數的對比,通過打印結果可以知道,findall()相對最好用的、也是最常用ed函數。

例5:group()函數

import re

s= 'life is shot ,i use python, i love python'

r= re.search('life(.*)python(.*)python',s)

r1= re.findall('life(.*)python(.*)python',s)

print(r.group(0))#group(0)記錄完整匹配結果

print(r.group(1))#0和1的區別

print(r.group(2))

print(r.group(0,1,2))#打印出0,1,2組的值

print(r.groups())#groups()不會返回完整匹配結果

print(r1)


最後,通過一個例子瞭解一下group這個分組函數。在上面這行代碼中,正則表達式中用life和Python作爲匹配的邊界,將(.*)作爲一組匹配值。

group(0)是group函數的特殊形式,它記錄完整的匹配結果,還要注意到groups()它不會返回完整匹配結果,它會把匹配到的結果打印出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章