Python re正則表達式

參考:

博客園《Python正則表達式指南》

博客園《Python之re模塊》


在此感謝博主的無私奉獻,本文主要介紹python中re模塊的幾個簡單用法,詳細的用法請參考博客園的這兩篇博文

 

python在文本處理方面是很強大的,得益於有re這樣強大的模塊,re模塊是用於處理文本的超級強大的工具,當然了,其他語言可能也提供了正則表達式的模塊,但是個人感覺python的re模塊做的是非常好的

 

當然了,外行會問了,正則表達式是做什麼的呀?聽起來玄乎其神的,說白了就是,給你一個很大的文本文件,讓你在裏面找符合一定規律的語句,你怎麼找呢?比如讓你找一個這樣的語句:ABCDabcd,你也許會說直接用str類的查找就好了,好,那我問你如果讓你查找一個這樣的呢ABCD???abcd,其中的問號表示任意的一個數字,也就是(ABCD三個數字abcd)這樣的形式呢?難倒你了吧,哈哈哈,現在使用正則表達式處理這樣的問題就妥妥的啦

 

簡單介紹一下,使用正則表達式的流程:

A, 初始化一個正則表達式引擎

B, 使用這個引擎在給定的文本里面查找符合條件的結果

 

先來看一下re模塊的語法吧,見下圖:




re中的函數:

 

re.compile(pattern, flags=0)

返回一個正則表達式對象,下面兩種寫法的作用是等價的:

寫法1:

prog = re.compile(pattern)

result = prog.match(string)

寫法2:

result = re.match(pattern, string)


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

從string的開頭進行匹配,如果開頭沒有匹配成功,則返回None,如果匹配成功,返回且僅僅返回第一個match object(一會再介紹match object的用法)

 

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

掃描整個string,如果沒有匹配,返回None,否則僅僅返回第一個成功匹配的matchobject

 

re.split(pattern, string, maxsplit=0, flags=0)

通過正則表達式將字符串分離。如果用括號將正則表達式括起來,那麼匹配的字符串也會被列入到list中返回。maxsplit是分離的次數,maxsplit=1分離一次,默認爲0,不限制次數。

示例:

>>> re.split('\W+', 'Words, words, words.')

['Words', 'words', 'words', '']

>>> re.split('(\W+)', 'Words, words, words.')

['Words', ', ', 'words', ', ', 'words', '.', '']

>>> re.split('\W+', 'Words, words, words.', 1)

['Words', 'words, words.']

>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)

['0', '3', '9']

也許你可能看起來比較吃力,提示一下:\W表示非單詞字符,+號表示匹配前一個字符1次或多次,這樣理解起來就容易一些了吧,還有,如果在字符串的開始或結尾就匹配,返回的list將會以空串開始或結尾,如果字符串不能匹配,將會返回整個字符串的list。

 

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

找到RE 匹配的所有子串,並把它們作爲一個列表返回。這個匹配是從左到右有序地返回。如果無匹配,返回空列表(個人覺得這個函數是最常用的)

 

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

搜索string,返回一個順序訪問每個匹配結果(matchobject)的迭代器

示例:

import re

p = re.compile(r'\d+')

for m in p.finditer('one1two2three3four4'):

print(m.group(),end=’’)

### output ###

# 1 2 3 4

 

re.sub(pattern, repl, string, count=0, flags=0)

使用repl替換string中每一個匹配的子串後返回替換後的字符串。 

當repl是一個字符串時,可以使用\id或\g<id>、\g<name>引用分組,但不能使用編號0。 

當repl是一個方法時,這個方法應當只接受一個參數(Match對象),並返回一個字符串用於替換(返回的字符串中不能再引用分組)。 

count用於指定最多替換次數,不指定時全部替換。

 

re.subn(pattern, repl, string, count=0, flags=0)

實現的功能跟sub()函數是一樣的,但是返回的結果是(new_string,number_of_subs_made)

 


match object:


匹配對象,這個是match(),search(),finditer()函數返回的值。

屬性:

string: 匹配時使用的文本。

re: 匹配時使用的Pattern對象。

pos: 文本中正則表達式開始搜索的索引。值與Pattern.match()和Pattern.seach()方法的同名參數相同。

endpos: 文本中正則表達式結束搜索的索引。值與Pattern.match()和Pattern.seach()方法的同名參數相同。

lastindex: 最後一個被捕獲的分組在文本中的索引。如果沒有被捕獲的分組,將爲None。

lastgroup: 最後一個被捕獲的分組的別名。如果這個分組沒有別名或者沒有被捕獲的分組,將爲None。

 

方法:

group([group1, …]): 

獲得一個或多個分組截獲的字符串;指定多個參數時將以元組形式返回。group1可以使用編號也可以使用別名;編號0代表整個匹配的子串;不填寫參數時,返回group(0);沒有截獲字符串的組返回None;截獲了多次的組返回最後一次截獲的子串。

groups([default]):

以元組形式返回全部分組截獲的字符串。相當於調用group(1,2,…last)。default表示沒有截獲字符串的組以這個值替代,默認爲None。

groupdict([default]): 

返回以有別名的組的別名爲鍵、以該組截獲的子串爲值的字典,沒有別名的組不包含在內。default含義同上。

start([group]): 

返回指定的組截獲的子串在string中的起始索引(子串第一個字符的索引)。group默認值爲0。

end([group]):   

返回指定的組截獲的子串在string中的結束索引(子串最後一個字符的索引+1)。group默認值爲0。

span([group]): 

返回(start(group), end(group))。

expand(template): 

將匹配到的分組代入template中然後返回。template中可以使用\id或\g<id>、\g<name>引用分組,但不能使用編號0。\id與\g<id>是等價的;但\10將被認爲是第10個分組,如果你想表達\1之後是字符'0',只能使用\g<1>0。



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