Python正則表達(dá)re模塊之findall()函數(shù)詳解
一、re.findall函數(shù)介紹
它在re.py中有定義:
def findall(pattern, string, flags=0): """Return a list of all non-overlapping matches in the string. If one or more capturing groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result.""" return _compile(pattern, flags).findall(string)
返回string中所有與pattern匹配的全部字符串,返回形式為數(shù)組。
findall()函數(shù)的兩種表示形式
import re kk = re.compile(r'\d+') kk.findall('one1two2three3four4') #[1,2,3,4] #注意此處findall()的用法,可傳兩個(gè)參數(shù); kk = re.compile(r'\d+') re.findall(kk,"one123") #[1,2,3]
二、實(shí)例代碼
后面會(huì)講解代碼里的各個(gè)部分,先列出來(lái)~
import re str = 'aabbabaabbaa' # 一個(gè)"."就是匹配除 \n (換行符)以外的任意一個(gè)字符 print(re.findall(r'a.b',str))#['aab', 'aab'] # *前面的字符出現(xiàn)0次或以上 print(re.findall(r'a*b',str))#['aab', 'b', 'ab', 'aab', 'b'] # 貪婪,匹配從.*前面為開(kāi)始到后面為結(jié)束的所有內(nèi)容 print(re.findall(r'a.*b',str))#['aabbabaabb'] # 非貪婪,遇到開(kāi)始和結(jié)束就進(jìn)行截取,因此截取多次符合的結(jié)果,中間沒(méi)有字符也會(huì)被截取 print(re.findall(r'a.*?b',str))#['aab', 'ab', 'aab'] # 非貪婪,與上面一樣,只是與上面的相比多了一個(gè)括號(hào),只保留括號(hào)的內(nèi)容 print(re.findall(r'a(.*?)b',str))#['a', '', 'a'] str = '''aabbab aabbaa bb''' #后面多加了2個(gè)b # 沒(méi)有把最后一個(gè)換行的aab算進(jìn)來(lái) print(re.findall(r'a.*?b',str))#['aab', 'ab', 'aab'] # re.S不會(huì)對(duì)\n進(jìn)行中斷 print(re.findall(r'a.*?b',str,re.S))#['aab', 'ab', 'aab', 'aa\n b']
三、re.findall中正則表達(dá)式(.*?)
字符串是
str = 'aabbabaabbaa'
1. 符號(hào) . 就 是匹配除 \n (換行符)以外的任意一個(gè)字符
print(re.findall(r'a.b',str)) #['aab', 'aab']
2.符號(hào) * 前面的字符出現(xiàn)0次或以上
print(re.findall(r'a*b',str)) #['aab', 'b', 'ab', 'aab', 'b']
3.符號(hào).* 貪婪,匹配從.*前面為開(kāi)始到后面為結(jié)束的所有內(nèi)容
print(re.findall(r'a.*b',str)) #['aabbabaabb']
4.符號(hào).*? 非貪婪,遇到開(kāi)始和結(jié)束就進(jìn)行截取,因此截取多次符合的結(jié)果,中間沒(méi)有字符也會(huì)被截取
print(re.findall(r'a.*?b',str)) #['aab', 'ab', 'aab']
5.符號(hào)(.*?) 非貪婪,與上面一樣,只是與上面的相比多了一個(gè)括號(hào),只保留括號(hào)的內(nèi)容
print(re.findall(r'a(.*?)b',str)) #['a', '', 'a']
關(guān)于帶括號(hào)與不帶括號(hào)的區(qū)別
import re string="abcdefg acbdgef abcdgfe cadbgfe" #不帶括號(hào) regex=re.compile("((\w+)\s+\w+)") print(regex.findall(string)) #輸出:[('abcdefg acbdgef', 'abcdefg'), ('abcdgfe cadbgfe', 'abcdgfe')] regex1=re.compile("(\w+)\s+\w+") print(regex1.findall(string)) #輸出:['abcdefg', 'abcdgfe'] regex2=re.compile("\w+\s+\w+") print(regex2.findall(string)) #輸出:['abcdefg acbdgef', 'abcdgfe cadbgfe']
- 第一個(gè) regex 中帶有2個(gè)括號(hào),其輸出list 中包含2個(gè) tuple
- 第二個(gè) regex 中帶有1個(gè)括號(hào),其輸出內(nèi)容是括號(hào)匹配到的內(nèi)容,而不是整個(gè)表達(dá)式所匹配到的結(jié)果。
- 第三個(gè) regex 中不帶括號(hào),其輸出的內(nèi)容就是整個(gè)表達(dá)式所匹配到的內(nèi)容。
實(shí)際上這并不是python特有的,這是正則所特有的 , 任何一門(mén)高級(jí)語(yǔ)言使用正則都滿(mǎn)足這個(gè)特點(diǎn):有括號(hào)時(shí)只能匹配到括號(hào)中的內(nèi)容,沒(méi)有括號(hào)【相當(dāng)于在最外層增加了一個(gè)括號(hào)】。在正則里面 "()" 代表的是分組的意思,一個(gè)括號(hào)代表一個(gè)分組,你只能匹配到 "()" 中的內(nèi)容。
四、re.findall中參數(shù)re.S的意義
1.字符串變?yōu)椋ê竺娑嗉恿?個(gè)b)
str = '''aabbab aabbaa bb'''
2.參數(shù)無(wú)re.S,沒(méi)有把最后一個(gè)換行的aab算進(jìn)來(lái)
print(re.findall(r'a.*?b',str)) #['aab', 'ab', 'aab']
3.參數(shù)有re.S,不會(huì)對(duì)\n進(jìn)行中斷
print(re.findall(r'a.*?b',str,re.S)) #['aab', 'ab', 'aab', 'aa\n b']
參考
總結(jié)
到此這篇關(guān)于Python正則表達(dá)re模塊之findall()函數(shù)詳解的文章就介紹到這了,更多相關(guān)Python正則表達(dá)re模塊findall()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python按比例隨機(jī)切分?jǐn)?shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了python按比例隨機(jī)切分?jǐn)?shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python操作word文檔插入圖片和表格的實(shí)例演示
這篇文章主要給大家介紹了關(guān)于Python操作word文檔插入圖片和表格的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10python執(zhí)行等待程序直到第二天零點(diǎn)的方法
這篇文章主要介紹了python執(zhí)行等待程序直到第二天零點(diǎn)的方法,涉及Python等待程序的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-04-04