1. 程式人生 > >助你理解python中的正則表示式

助你理解python中的正則表示式

常用正則函式:
m = re.search(pattern, string) # 搜尋整個字串,直到發現符合的子字串。
m = re.match(pattern, string) # 從頭開始檢查字串是否符合正則表示式。必須從字串的第一個字元開始就相符。
可以從這兩個函式中選擇一個進行搜尋。上面的例子中,我們如果使用re.match()的話,則會得到None,因為字串的起始為‘a’, 不符合’[0-9]'的要求。
對於返回的m, 我們使用m.group()來呼叫結果。(我們會在後面更詳細解釋m.group())

我們還可以在搜尋之後將搜尋到的子字串進行替換:
str = re.sub(pattern, replacement, string) # 在string中利用正則變換pattern進行搜尋,對於搜尋到的字串,用另一字串replacement替換。返回替換後的字串。

此外,常用的正則表示式函式還有
re.split() # 根據正則表示式分割字串, 將分割後的所有子字串放在一個表(list)中返回
re.findall() # 根據正則表示式搜尋字串,將所有符合的子字串放在一給表(list)中返回
re.compile函式
re模組中包含一個重要函式是compile(pattern [, flags]) ,該函式根據包含的正則表示式的字串建立模式物件。可以實現更有效率的匹配。在直接使用字串表示的正則表示式進行search,match和findall操作時,python會將字串轉換為正則表示式物件。而使用compile完成一次轉換之後,在每次使用模式的時候就不用重複轉換。當然,使用re.compile()函式進行轉換後,re.search(pattern, string)的呼叫方式就轉換為 pattern.search(string)的呼叫方式。

其中,後一種呼叫方式中,pattern是用compile建立的模式物件。如下:

import re
some_text = ‘a,b,c d’
reObj = re.compile(’[, ]+’)
reObj.split(some_text)
[‘a’, ‘b’, ‘c’, ‘d’]

2.不使用re.compile
在進行search,match等操作前不適用compile函式,會導致重複使用模式時,需要對模式進行重複的轉換。降低匹配速度。而此種方法的呼叫方式,更為直觀。如下:

import re
some_text = ‘a,b,c d’
re.split(’[, ]+’,some_text)
[‘a’, ‘b’, ‘c’, ‘d’]

常用正則表現形式:
1)單個字元:
. 任意的一個字元
a|b 字元a或字元b
[afg] a或者f或者g的一個字元
[0-4] 0-4範圍內的一個字元
[a-f] a-f範圍內的一個字元
[^m] 不是m的一個字元
\s 一個空格
\S 一個非空格
\d [0-9]
\D [^0-9]
\w [0-9a-zA-Z]
\W [^0-9a-zA-Z]

2)重複
緊跟在單個字元之後,表示多個這樣類似的字元

  •     重複 >=0 次
    
  •     重複 >=1 次
    

? 重複 0或者1 次
{m} 重複m次。比如說 a{4}相當於aaaa,再比如說[1-3]{2}相當於[1-3][1-3]
{m, n} 重複m到n次。比如說a{2, 5}表示a重複2到5次。小於m次的重複,或者大於n次的重複都不符合條件。

正則表達 相符的字串舉例
[0-9]{3,5} 9678
a?b b
a+b aaaaab

3) 位置
^ 字串的起始位置
$ 字串的結尾位置

正則表達 相符的字串舉例 不相符字串
^ab.*c$ abeec cabeec (如果用re.search(), 將無法找到。)

4)返回控制
我們有可能對搜尋的結果進行進一步精簡資訊。比如下面一個正則表示式:
output_(\d{4})
該正則表示式用括號()包圍了一個小的正則表示式,\d{4}。 這個小的正則表示式被用於從結果中篩選想要的資訊(在這裡是四位數字)。這樣被括號圈起來的正則表示式的一部分,稱為群(group)。
我們可以m.group(number)的方法來查詢群。group(0)是整個正則表達的搜尋結果,group(1)是第一個群……
import re
m = re.search(“output_(\d{4})”, “output_1986.txt”)
print(m.group(1))

我們還可以將群命名,以便更好地使用m.group查詢:
import re
m = re.search(“output_(?P\d{4})”, “output_1986.txt”) #(?P…) 為group命名
print(m.group(“year”))