python 字元串的匹配與查找

在日常工作中,尤其是根據日誌定位,我們常常需要手動搜索大量的關鍵字元串,進行問題定位。第一次可能是技術的學習,那麼從第二次開始,就開始是大量的體力勞動,遵循凡事重複的體力勞動,都交給python的原則,我們可以利用python把我們需要的字元串都找出來,避免純手工操作。

1、正則表達式

正則表達式,幾乎是計算機領域繞不過去的一種手段了,畢竟機器並不是人,比如人看到100-109這些自然會認為是數值。並且滿足:

1)它是三位數。

2)它大於等於100,並且小於等於109。

但是在機器的眼裡,它並沒有這些意義,如果從存儲的角度看,所有的在計算機的內容都是二進位的1和0。之所以我們能在文本裡面看到100,101,102,...,109。是因為我們將這些二進位進行了再翻譯,這種過程叫做編碼。

所以如何讓程序知道,你要找的是東西呢?

比如說上面的例子,我們要找的100-109這個範圍的數值,一種最簡單的方法是把這10個數每次遍歷一遍文本找到,但是當我們擴大範圍呢10000-99999,找的這個範圍內的數值,每個數字都進行遍歷顯然是不太現實的。

這時我們可以用正則定義一個規則「ddd」,它告訴計算機,我們要尋找一個三位數字的字元串。但是這樣的三位數是很多的,如何找的100到109範圍內的整數呢。可以觀察到100到109,它們的第一位數都是1,第二位是0,第三位則是取0-9任意值。於是我們只要限定這三位的取值,就可以找的對應的字元串了----》「10[0-9]」

[0-9]就是一種通配符的表達,它表示這裡可以取0-9的任意值。

事實上正則表達式遠沒有這麼簡單,確切的說,它因為不同需求,複雜程度也是不同的。學習正則表達式,可以參考下面鏈接的資料:

正則表達式30分鐘入門教程

2、python的re 模塊

re是python內嵌的,用於匹配正則表達式的模塊,因此,可以直接引用re的模塊來運用正則表達式查詢我們想要的內容。

re模塊內部集成了很多方法,這裡只簡單介紹幾種比較常用的方法。

1)findall

re.findall遍歷匹配,可以獲取字元串中所有匹配的字元串,返回一個列表。

格式:

re.findall(pattern, string, flags=0)

pattern: 編譯時用的表達式字元串。

flags 編譯標誌位,用於修改正則表達式的匹配方式,如:是否區分大小寫,多行匹配等。常用的flags有:

例如我們要找的字元串中的102。

運行結果:

2)compile

編譯正則表達式模式,返回一個對象的模式。(可以把那些常用的正則表達式編譯成正則表達式對象,這樣可以提高一點效率。)

格式:

re.compile(pattern,flags=0)

那麼上面的例子,我們還可以這麼寫:

re還提供了很多方法用於更方便的查找字元串,這裡不再一一詳細敘述。

好了,我們現在實現這樣一個小項目,工作中,你的領導需要你將日誌log.log中所有101-109的數值,查找出來。那麼你應該怎麼做呢?

1)正則表達式可以用「10[0-9]」表示

2)利用re把log.log中滿足要求的內容查找出來。

log.log內容如下:

簡化代碼如下:

運行結果如圖:

正則+python 可以幫助你實現更多有趣的內容。查找匹配字元串的技能幾乎在python中無處不在,這將有助於你更好的用python幫助自己解決問題,從繁複的體力查找中抽出時間,進行更有意義的思考。

推薦閱讀:

1.2 程序被其他程序翻譯成不同格式
簡析組件AWT和Swing各有的優缺點及區別
我好像有能力閱讀《深入理解計算機系統》了

TAG:Python入門 | 自學編程 | Python |