參考:
在此感謝博主的無私奉獻,本文主要介紹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'):
### output ###print(m.group(),end=’’)
# 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。