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各有的優缺點及區別
※我好像有能力閱讀《深入理解計算機系統》了