python/200498.html">python/286133.html">re模塊下的函數(shù)
compile(pattern):創(chuàng)建模式對(duì)象
import repat=re.compile('A')m=pat.search('CBA')          #等價(jià)于 re.search('A','CBA')print m<_sre.SRE_Match object at 0x9d690c8>  #匹配到了,返回MatchObject(True)m=pat.search('CBD')print mNone                  #沒(méi)有匹配到,返回None(False)search(pattern,string):在字符串中尋找模式
m = re.search('asd','ASDasd')print m<_sre.SRE_Match object at 0xb72cd6e8> #匹配到了,返回MatchObject(True)m = re.search('asd','ASDASD')print mNone                  #沒(méi)有匹配到,返回None(False)match(pattern,string):在字符串開(kāi)始處匹配模式
m = re.search('asd','ASDasd')print m<_sre.SRE_Match object at 0xb72cd6e8> #匹配到了,返回MatchObject(True)m = re.search('asd','ASDASD')print mNone                  #沒(méi)有匹配到,返回None(False)等價(jià)于
pat=re.compile('a')print pat.match('Aasd')Noneprintpat.match('aASD')<_sre.SRE_Match object at 0xb72cd6e8>上面的函數(shù)返回都可以在if條件語(yǔ)句中進(jìn)行判斷:
if pat.search('asd'):...   print 'OK'... OK    #找到返回if re.search('a','ASD'):...   print "OK"...    #沒(méi)有找到split(pattern,string):根據(jù)模式分割字符串,返回列表
re.split(',','a,s,d,asd')['a', 's', 'd', 'asd']     #返回列表 pat = re.compile(',')pat.split('a,s,d,asd')['a', 's', 'd', 'asd']     #返回列表 re.split('[, ]+','a , s ,d   ,,,,,asd')  #正則匹配:[, ]+,后面說(shuō)明['a', 's', 'd', 'asd'] re.split('[, ]+','a , s ,d   ,,,,,asd',maxsplit=2) # maxsplit 最多分割次數(shù)['a', 's', 'd   ,,,,,asd'] pat = re.compile('[, ]+')           #正則匹配:[, ]+,后面說(shuō)明pat.split('a , s ,d   ,,,,,asd',maxsplit=2)    # maxsplit 最多分割次數(shù)['a', 's', 'd   ,,,,,asd']findall(pattern,string):列表形式返回匹配項(xiàng)
re.findall('a','ASDaDFGAa') ['a', 'a']              #列表形式返回匹配到的字符串pat = re.compile('a')pat.findall('ASDaDFGAa')['a', 'a']              #列表形式返回匹配到的字符串pat = re.compile('[A-Z]+')    #正則匹配:'[A-Z]+' 后面有說(shuō)明pat.findall('ASDcDFGAa')['ASD', 'DFGA']           #找到匹配到的字符串pat = re.compile('[A-Z]')pat.findall('ASDcDFGAa')     #正則匹配:'[A-Z]+' 后面有說(shuō)明['A', 'S', 'D', 'D', 'F', 'G', 'A'] #找到匹配到的字符串pat = re.compile('[A-Za-z]')   #正則匹配:'[A-Za-z]+' 匹配所有單詞,后面有說(shuō)明pat.findall('ASDcDFGAa')['A', 'S', 'D', 'c', 'D', 'F', 'G', 'A', 'a'] sub(pat,repl,string) :用repl替換 pat匹配項(xiàng)
(留的是中間的,因?yàn)橹虚g在中心)
 re.sub('a','A','abcasd')  #找到a用A替換,后面見(jiàn)和group的配合使用'AbcAsd'pat = re.compile('a')pat.sub('A','abcasd')'AbcAsd' pat=re.compile(r'www/.(.*)/..{3}') #正則表達(dá)式 #在Python的string前面加上‘r', 是為了告訴編譯器這個(gè)string是個(gè)raw string,不要轉(zhuǎn)譯反斜杠 '/' 。 #例如,/n 在raw string中,是兩個(gè)字符,/和n, 而不會(huì)轉(zhuǎn)譯為換行符。 #由于正則表達(dá)式和 / 會(huì)有沖突,因此,當(dāng)一個(gè)字符串使用了正則表達(dá)式后,最好在前面加上'r'。  #與大多數(shù)編程語(yǔ)言相同,正則表達(dá)式里使用"/"作為轉(zhuǎn)義字符,這就可能造成反斜杠困擾。  #假如你需要匹配文本中的字符"/",那么使用編程語(yǔ)言表示的正則表達(dá)式里將需要4個(gè)反斜杠"////":  #前兩個(gè)和后兩個(gè)分別用于在編程語(yǔ)言里轉(zhuǎn)義成反斜杠,轉(zhuǎn)換成兩個(gè)反斜杠后再在正則表達(dá)式里轉(zhuǎn)義成一個(gè)反斜杠。  #Python里的原生字符串很好地解決了這個(gè)問(wèn)題,這個(gè)例子中的正則表達(dá)式可以使用r"//"表示。  #同樣,匹配一個(gè)數(shù)字的"//d"可以寫(xiě)成r"/d"。  #有了原生字符串,你再也不用擔(dān)心是不是漏寫(xiě)了反斜杠,寫(xiě)出來(lái)的表達(dá)式也更直觀。  #不是說(shuō) 加了r /就沒(méi)有轉(zhuǎn)譯功能,好亂,就直接記住1句話:  #當(dāng)一個(gè)字符串使用了正則表達(dá)式后,最好在前面加上'r',這樣你再也不用擔(dān)心是不是漏寫(xiě)了反斜杠,寫(xiě)出來(lái)的表達(dá)式也更直觀pat.match('www.dxy.com').group(1)'dxy're.sub(r'www/.(.*)/..{3}',r'/1','hello,www.dxy.com')pat.sub(r'/1','hello,www.dxy.com') 'hello,dxy'# r'1' 是第一組的意思#通過(guò)正則匹配找到符合規(guī)則的"www.dxy.com" ,取得 組1字符串 去替換 整個(gè)匹配。 pat=re.compile(r'(/w+) (/w+)')   #正則表達(dá)式s='hello world ! hello hz !'pat.findall('hello world ! hello hz !')[('hello', 'world'), ('hello', 'hz')]pat.sub(r'/2 /1',s)        #通過(guò)正則得到組1(hello),組2(world),再通過(guò)sub去替換。即組1替換組2,組2替換組1,調(diào)換位置。 'world hello!hz hello!'escape(string) :對(duì)字符串里面的特殊字符串進(jìn)行轉(zhuǎn)義
re.escape('www.dxy.cn')'www//.dxy//.cn'          #轉(zhuǎn)義上面的函數(shù)中,只有match、search有g(shù)roup方法,其他的函數(shù)沒(méi)有。
函數(shù)的方法
group:獲取子模式(組)的匹配項(xiàng)
pat = re.compile(r'www/.(.*)/.(.*)')    #用()表示1個(gè)組,2個(gè)組m = pat.match('www.dxy.com')m.group()                 #默認(rèn)為0,表示匹配整個(gè)字符串  'www.dxy.com'm.group(1)                 #返回給定組1匹配的子字符串'dxy'm.group(2)'com'start:給定組匹配項(xiàng)的開(kāi)始位置
m.start(2) #組2開(kāi)始的索引8
end:給定組匹配項(xiàng)的結(jié)束位置
m.end(2) #組2結(jié)束的索引11
span: 給定組匹配項(xiàng)的開(kāi)始結(jié)束位置
m.span(2) #組2開(kāi)始、結(jié)束的索引(8, 11)
正則表達(dá)式
正則表達(dá)式(可以稱為REs,regex,regex pattens)是一個(gè)小巧的,高度專業(yè)化的編程語(yǔ)言,它內(nèi)嵌于python開(kāi)發(fā)語(yǔ)言中,可通過(guò)re模塊使用。正則表達(dá)式的pattern可以被編譯成一系列的字節(jié)碼,然后用C編寫(xiě)的引擎執(zhí)行。下面簡(jiǎn)單介紹下正則表達(dá)式的語(yǔ)法。
元字符
“.” :通配符,除換行符外的任意的1個(gè)字符
pat=re.compile('.')pat.match('abc')<_sre.SRE_Match object at 0xb72b6170>pat.match('abc').group()'a'                #匹配到了首個(gè)字符pat.search('abc').group() 'a'pat.match('/n').group()    #換行符匹配出錯(cuò)Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'NoneType' object has no attribute 'group'“/” : 轉(zhuǎn)義符
pat=re.compile('/.')pat.search('abc.efg').group() #匹配到.'.' pat.findall('abc.efg')     #不用group,返回列表['.']“[…]” : 字符集合,匹配里面的任意一個(gè)元素
>>> pat=re.compile('[abc]')>>> pat.match('axbycz').group()'a'>>> pat.search('axbycz').group()'a'>>> pat.findall('axbycz')['a', 'b', 'c']“/d” : 數(shù)字
>>> pat=re.compile('/d')      >>> pat.search('ax1by2cz3').group()  #匹配到第一個(gè)數(shù)字:1,返回'1'>>> pat.match('ax1by2cz3').group()  #匹配不到(首個(gè)不是)返回None,報(bào)錯(cuò),match匹配字符串頭Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'NoneType' object has no attribute 'group'>>> pat.findall('ax1by2cz3')     #匹配所有的數(shù)字,列表返回['1', '2', '3']“/D” : 非數(shù)字
>>> pat=re.compile('/D')>>> pat.match('ax1by2cz3').group()'a'>>> pat.search('ax1by2cz3').group()'a'>>> pat.findall('ax1by2cz3')['a', 'x', 'b', 'y', 'c', 'z']“/s” :空白字符 、 /t、/r、/n、空格
>>> pat=re.compile('/s')>>> pat.findall('/rax1 /nby2 /tcz3')['/r', ' ', '/n', ' ', '/t']>>> pat.search('/rax1 /nby2 /tcz3').group()'/r'>>> pat.match('/rax1 /nby2 /tcz3').group()'/r'“S” :非空白字符
>>> pat=re.compile('/S')>>> pat.search('/rax1 /nby2 /tcz3').group()'a'>>> pat.findall('/rax1 /nby2 /tcz3')['a', 'x', '1', 'b', 'y', '2', 'c', 'z', '3']“/w” :?jiǎn)蝹€(gè)的 數(shù)字和字母,[A-Za-z0-9]
>>> pat=re.compile('/w')>>> pat.search('1a2b3c').group()'1'>>> pat.findall('1a2b3c')['1', 'a', '2', 'b', '3', 'c']>>> pat.match('1a2b3c').group()'1'“/W”:非單詞字符,除數(shù)字和字母外
>>> pat=re.compile('/W')>>> pat.findall('1a2我b3c') #python是用三字節(jié)表示一個(gè)漢字['/xe6', '/x88', '/x91']>>> pat.search('1a2我b3c').group()'/xe6'數(shù)量詞
“*” :0次或多次
( 乘0會(huì)變成0)
>>> pat = re.compile('[abc]*')>>> pat.match('abcabcdefabc').group() 'abcabc'               #2次>>> pat.search('abcabcdefabc').group()'abcabc'               #2次>>> pat.findall('abcabcdefabc')['abcabc', '', '', '', 'abc', '']   #2次和1次,因?yàn)橛?次,所以匹配了''“+” :1次或多次
( 加0不會(huì)變成0)
>>> pat = re.compile('[abc]+')>>> pat.match('abcdefabcabc').group()'abc'>>> pat.search('abcdefabcabc').group()'abc'>>> pat.findall('abcdefabcabc')['abc', 'abcabc']“?” :0次或1次,match,search 不會(huì)出現(xiàn)none,會(huì)出現(xiàn)' ‘ (因?yàn)?次也是符合的)
0次或1次不是指[xxx]這個(gè)集合,而是其中的任何的一個(gè)字符
>>> pat = re.compile('[abc]?')>>> pat.match('defabc').group()   #0次''>>> pat.match('abcdefabc').group()'a'>>> pat.search('defabc').group()  #0次''>>> pat.findall('defabc')      #0次和1次['', '', '', 'a', 'b', 'c', '']   #后面總再加個(gè)''“數(shù)量詞?” :非貪婪模式:只匹配最少的(盡可能少);默認(rèn)貪婪模式:匹配最多的(盡可能多)
>>> pat = re.compile('[abc]+')     #貪婪模式>>> pat.match('abcdefabcabc').group() #匹配盡可能多的:abc'abc'>>> pat.match('bbabcdefabcabc').group()'bbabc'>>> pat.search('dbbabcdefabcabc').group()'bbabc'>>> pat.findall('abcdefabcabc')['abc', 'abcabc']>>> pat = re.compile('[abc]+?')    #非貪婪模式:+?>>> pat.match('abcdefabcabc').group() #匹配盡可能少的:a、b、c'a'>>> pat.search('dbbabcdefabcabc').group()'b'>>> pat.findall('abcdefabcabc')['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']“{m}” :匹配字符串出現(xiàn)m次
>>> pat = re.compile('[op]{2}')   #o或p出現(xiàn)2次>>> pat.search('abcooapp').group() #匹配第一次出現(xiàn)的字符串,o比p先出現(xiàn)'oo'>>> pat.findall('abcooapp')     #匹配出現(xiàn)的所有字符串,列表形式返回['oo', 'pp']“{m,n}” :匹配字符串出現(xiàn)m到n次
>>> pat = re.compile('[op]{2,4}')   #o或則p出現(xiàn)2到4次>>> pat.match('pppabcooapp').group() #匹配開(kāi)頭'ppp'>>> pat.search('pppabcooapp').group() #匹配第一次出現(xiàn)'ppp'>>> pat.findall('pppabcooapp')    #匹配所有['ppp', 'oo', 'pp'].group() #匹配第一次出現(xiàn)
邊界
“^” :匹配字符串開(kāi)頭或行頭
>>> pat = re.compile('^[abc]')   #開(kāi)頭是a、b、c中的任意一個(gè)>>> pat.search('defabc').group()   >>> pat.match('defabc').group()  #均找不到>>> pat.findall('defabc')[]>>> pat.search('adefabc').group()'a'>>> pat.match('adefabc').group()  #開(kāi)頭是a、b、c中的任意一個(gè)'a'>>> pat.findall('adefabc')['a']>>> pat = re.compile('^[abc]+')  #開(kāi)頭是a、b、c中的任意一個(gè)的一次或則多次,貪婪:匹配多個(gè)>>> pat.findall('cbadefab')['cba']>>> pat = re.compile(r'^[abc]+?') #開(kāi)頭是a、b、c中的任意一個(gè)的一次或則多次,非貪婪:匹配一個(gè)>>> pat.findall('cbadefab')['c']“$” :匹配字符串結(jié)尾或則行尾
>>> pat = re.compile('[abc]$')>>> pat.match('adefAbc').group()  #match匹配的是字符串開(kāi)頭,所以查找$的時(shí),總是返回None>>> pat.search('adefAbc').group() #結(jié)尾是a、b、c中的任意一個(gè)'c'>>> pat.findall('adefAbc')     ['c']>>> pat = re.compile('[abc]+$')>>> pat.search('adefAbc').group() #結(jié)尾是a、b、c中的任意一個(gè)的一次或則多次,貪婪:匹配多個(gè)'bc'>>> pat.findall('adefAbc')['bc']“/A”:匹配字符串開(kāi)頭
>>> pat = re.compile('/A[abc]+')>>> pat.findall('cbadefab')['cba']>>> pat.search('cbadefab').group()'cba'“/Z”:匹配字符串結(jié)尾
>>> pat = re.compile('[abc]+/Z')>>> pat.search('cbadefab').group()'ab'>>> pat.findall('cbadefab')['ab']分組
(…):分組匹配,從左到右,每遇到一個(gè) ( 編號(hào)+1,分組后面可加數(shù)量詞
>>> pat=re.compile(r'(a)/w(c)') #/w:單個(gè)的數(shù)字或字母 [A-Za-z0-9]>>> pat.match('abcdef').group()'abc'>>> pat=re.compile('(a)b(c)')  #分2組,匿名分組                  >>> pat.match('abcdef').group() #默認(rèn)返回匹配的字符串'abc'>>> pat.match('abcdef').group(1) #取分組1,適用于search'a'>>> pat.match('abcdef').group(2) #取分組2,適用于search'c'>>> pat.match('abcdef').groups() #取所有分組,元組形式返回('a', 'c')<number>:引用編號(hào)為<number>的分組匹配到的字符串
>>> pat=re.compile(r'www/.(.*)/..{3}')>>> pat.match('www.dxy.com').group(1)'dxy'“(?P<name>…)” :在模式里面用()來(lái)表示分組(命名分組),適用于提取目標(biāo)字符串中的某一些部位。
>>> pat=re.compile(r'(?P<K>a)/w(c)')  #分2組:命名分組+匿名分組>>> pat.search('abcdef').groups()    #取所有分組,元組形式返回('a', 'c')>>> pat.search('abcdef').group(1)    #取分組1,適用于match'a'>>> pat.search('abcdef').group(2)    #取分組2,適用于match'c'>>> pat.search('abcdef').group()    #默認(rèn)返回匹配的字符串'abc'>>> pat.search('abcdef').groupdict()  #命名分組可以返回一個(gè)字典【專有】,匿名分組也沒(méi)有{'K': 'a'}“(?P=name)”:引用別名為<name>的分組匹配到的串
>>> pat=re.compile(r'(?P<K>a)/w(c)(?P=K)')  #(?P=K)引用分組1的值,就是a>>> pat.search('abcdef').group()       #匹配不到,因?yàn)橥暾?#39;a/wca',模式的第4位是aTraceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'NoneType' object has no attribute 'group' >>> pat.search('abcadef').group()       #匹配到,模式的第4位和組1一樣,值是c'abca'>>> pat.search('abcadef').groups()('a', 'c')>>> pat.search('abcadef').group(1)'a'>>> pat.search('abcadef').group(2)'c“<number>” :引用分組編號(hào)匹配:
>>> pat=re.compile(r'(?P<K>a)/w(c)(?P=K)/2') #/2引用分組2的值,就是c>>> pat.findall('Aabcadef')          #匹配不到,因?yàn)橥暾?#39;a/wcac',模式的第5位是c[]>>> pat.findall('Aabcacdef')         #匹配到,模式的第5位和組2一樣,值是c[('a', 'c')]>>> pat.search('Aabcacdef').groups()('a', 'c')>>> pat.search('Aabcacdef').group()'abcac'>>> pat.search('Aabcacdef').group(1)'a'>>> pat.search('Aabcacdef').group(2)'c'特殊構(gòu)造
	(?:…) (…)不分組版本,用于使用 | 或者后接數(shù)量詞
	(?iLmsux) iLmsux的每個(gè)字符代表一個(gè)匹配模式,只能用在正則表達(dá)式的開(kāi)頭,可選多個(gè)
	(?#…) #號(hào)后的內(nèi)容將作為注釋
	(?=…) 之后的字符串內(nèi)容需要匹配表達(dá)式才能成功匹配
	(?!…) 之后的字符串不匹配表達(dá)式才能成功
	(?(?(?(id/name) yes |no) 如果編號(hào)為id/名字為name的組匹配到字符串,則需要匹配yes,否則匹配no,no可以省略
	“(?:…)” :()里面有?:表示該()不是分組
>>> pat=re.compile(r'a(?:bc)')>>> pat.findall('abc')['abc']>>> pat.match('abc').groups()   #顯示不出分組“(?=…)”:匹配…表達(dá)式,返回。對(duì)后進(jìn)行匹配,總是對(duì)后面進(jìn)行匹配
>>> pat=re.compile(r'/w(?=/d)')  #匹配表達(dá)式/d,返回?cái)?shù)字的前一位,/w:?jiǎn)卧~字符[A-Za-z0-9]>>> pat.findall('abc1 def1 xyz1')['c', 'f', 'z']>>> pat.findall('zhoujy20130628hangzhou') #匹配數(shù)字的前一位,列表返回['y', '2', '0', '1', '3', '0', '6', '2']>>> pat=re.compile(r'/w+(?=/d)')>>> pat.findall('abc1,def1,xyz1')     #匹配最末數(shù)字的前字符串,列表返回['abc', 'def', 'xyz']>>> pat.findall('abc21,def31,xyz41')['abc2', 'def3', 'xyz4']>>> pat.findall('zhoujy20130628hangzhou')['zhoujy2013062']>>> pat=re.compile(r'[A-Za-z]+(?=/d)')    #[A-Za-z],匹配字母,可以用其他的正則方法>>> pat.findall('zhoujy20130628hangzhou123') #匹配后面帶有數(shù)字的字符串,列表返回['zhoujy', 'hangzhou']>>> pat.findall('abc21,def31,xyz41')['abc', 'def', 'xyz']“(?!…)” 不匹配…表達(dá)式,返回。對(duì)后進(jìn)行匹配
>>> pat=re.compile(r'[A-Za-z]+(?!/d)')    #[A-Za-z],匹配字母,可以用其他的正則方法>>> pat.findall('zhoujy20130628hangzhou123,12,binjiang310') #匹配后面不是數(shù)字的字符串,列表返回['zhouj', 'hangzho', 'binjian']>>> pat.findall('abc21,def31,xyz41')['ab', 'de', 'xy']“(?<=…)”:匹配…表達(dá)式,返回。對(duì)前進(jìn)行匹配,總是對(duì)前面進(jìn)行匹配
>>> pat=re.compile(r'(?<=/d)[A-Za-z]+')   #匹配前面是數(shù)字的字母>>> pat.findall('abc21,def31,xyz41')[]>>> pat.findall('1abc21,2def31,3xyz41')['abc', 'def', 'xyz']>>> pat.findall('zhoujy20130628hangzhou123,12,binjiang310')['hangzhou']“(?<!…)”:不匹配…表達(dá)式,返回。對(duì)前進(jìn)行匹配,總是對(duì)前面進(jìn)行匹配
>>> pat=re.compile(r'(?<!/d)[A-Za-z]+')   #匹配前面不是數(shù)字的字母>>> pat.findall('abc21,def31,xyz41')['abc', 'def', 'xyz']>>> pat.findall('zhoujy20130628hangzhou123,12,binjiang310')['zhoujy', 'angzhou', 'binjiang']“(?(id/name) yes |no)”: 組是否匹配,匹配返回
>>> pat=re.compile(r'a(/d)?bc(?(1)/d)')  #no省略了,完整的是a/dbc/d ==> a2bc3,總共5位,第2位是可有可無(wú)的數(shù)字,第5為是數(shù)字>>> pat.findall('abc9')          #返回組1,但第2位(組1)沒(méi)有,即返回了''['']>>> pat.findall('a8bc9')         #完整的模式,返回組1['8']>>> pat.match('a8bc9').group()'a8bc9'>>> pat.match('a8bc9').group(1)'8'>>> pat.findall('a8bc')          #第5位不存在,則沒(méi)有匹配到[]“(?iLmsux)”:這里就介紹下i參數(shù):大小寫(xiě)區(qū)分匹配
>>> pat=re.compile(r'abc')>>> pat.findall('abc')['abc']>>> pat.findall('ABC')[]>>> pat=re.compile(r'(?i)abc')      #(?i) 不區(qū)分大小寫(xiě)>>> pat.findall('ABC')['ABC']>>> pat.findall('abc')['abc']>>> pat.findall('aBc')['aBc']>>> pat.findall('aBC')['aBC']>>> pat=re.compile(r'abc',re.I)      #re.I 作為參數(shù)使用,推薦>>> pat.findall('aBC')['aBC']>>> pat.findall('abc')['abc']>>> pat.findall('ABC')['ABC']總結(jié)
以上就是本文關(guān)于Python編程之Re模塊下的函數(shù)介紹的全部?jī)?nèi)容,希望對(duì)大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
| 
 
 | 
新聞熱點(diǎn)
疑難解答
圖片精選