python中的re模块和正则表达式基础
?
1.正則匹配基礎(chǔ)知識(shí)
(1)通配符.
.只匹配一個(gè)字符
>>> re.findall("p.ckname","piiickname-pockname") ['pockname']如果要匹配.等特殊字符,要使用注意字符\
>>> re.findall("p.ckname","pickname--p.ckname") ['pickname', 'p.ckname'] >>> re.findall("p\.ckname","pickname--p.ckname") ['p.ckname']?
(2)字符集[],只能匹配單個(gè)字符,匹配多個(gè)見(4)
[a-z] 可以匹配a-z之間任意一個(gè)字符?
[a-zA-Z0-9]匹配a-z,A-Z,0-9的任意一個(gè)字符
[^p]反轉(zhuǎn)匹配,可以匹配除了p的一個(gè)字符串,注意是使用[ ]括起來的,和(5)區(qū)分出來
#例子
>>> re.findall("p[a-z]ckname","piickname-pockname") ['pockname'] >>> re.findall("p[a-z]*ckname","piickname-pockname") ['piickname', 'pockname']? >>> re.findall("p[^o]ckname","pickname-pockname")
? ['pickname'] ? ?@反轉(zhuǎn)匹配
?
(3)選擇符 | 相當(dāng)于或
>>> re.findall("name|test","pickname-testpy")
['name', 'test']
?
(4)可選項(xiàng),注意()的使用
()?子模式出現(xiàn)0次或者1次
()*子模式出現(xiàn)0次或者多次
()+子模式出現(xiàn)1次或者多次
(){m,n}子模式出現(xiàn)m-n次
在這個(gè)模式下注意一下findall和search的結(jié)果
>>> aa=re.search("(name){2}","myname--mynamename--my") >>> print aa.group() namename>>> re.findall("my(name){2}","myname--mynamename--my") ['name'] 這里匹配不到namename,需要進(jìn)一步理解re的幾個(gè)函數(shù)區(qū)別?
舉個(gè)例子r'(http://)?(www\.)?baidu\.com'
匹配結(jié)果:http://www.baidu.com
????????????? http://baidu.com
????????????? www.baidu.com
????????????? baidu.com
(5)開頭和結(jié)尾
^只想在字符串的開頭匹配http? ^http
$只想在字符串的結(jié)尾匹配http? http$
?
?這里要區(qū)分下不以http開頭的string怎么寫呢?
[^http]要寫在[ ?]里面
?
?
?
2.re模塊
re.compile()
可以把正則表達(dá)式編譯成一個(gè)正則表達(dá)式對(duì)象??梢园涯切┙?jīng)常使用的正則表達(dá)式編譯成正則表達(dá)式對(duì)象,這樣可以提高一定的效率。
text="hello,meixiaoer!"
pa=re.compile('h')
pa.match(text)?
pa.findall(text)
pa.search(text)
結(jié)果:<_sre.SRE_Match object at 0x01ADF100>
???????? ['h']
???????? <_sre.SRE_Match object at 0x01A6EDE8>
?re.match()
嘗試從字符串的開始匹配一個(gè)模式,只匹配一個(gè)!
re.match('h',text)??? 結(jié)果是<_sre.SRE_Match object at 0x01ADF090>
re.match('e',text)??? 結(jié)果是none
要是想打印出匹配字符可以這樣
m=re.match('h',text)?
print m.group(0)???? 結(jié)果是h
re.search() ?只匹配一個(gè)!
函數(shù)會(huì)在字符串內(nèi)查找模式匹配,直到找到第一個(gè)匹配然后返回,未匹配返回none
>>> re.search('e',text)
<_sre.SRE_Match object at 0x01ADF100>
打印元素
>>> m=re.search('e',text)
>>> print m.group(0)
e
因?yàn)橹黄ヅ涞谝粋€(gè)元素,所以第二個(gè)元素會(huì)報(bào)錯(cuò)
>>> m=re.search('e',text)
>>> print m.group()
IndexError: no such group
re.findall()查找多有符合的元素,匹配所有,返回列表
?
>>> re.findall("name","name-myname-yourname") ['name', 'name', 'name'] >>> re.findall("^name","name-myname-yourname") ['name'] 因?yàn)閊name正則表達(dá)式是從開始匹配的,可以理解下?另一個(gè)例子更清楚的看清三個(gè)函數(shù)的區(qū)別
#只有findall可以查找所有的 f=re.findall('[0-9]','2fff4') print f #['2','4'] 返回結(jié)果是列表 s=re.serach('[0-9]','fff45')//查找第一個(gè)符合的以后就停止查找了 print s.group() #4 m=re.match('[0-9]','fff45') //從第一個(gè)字符開始匹配,符合以后就停止查詢 print m.group() #None m=re.match('[0-9]','1fff45') print m.group() #1?
?###########一些常用的使用場(chǎng)景#################
?1.
#使用()進(jìn)行分組 #不使用(),表示表達(dá)式是一個(gè)組,就要使用group(0) m=re.match(r'\d{3}-\d{3,8}','010-12345') print m.group(0) #010-12345,ps特殊符號(hào)一遍要使用\-但是-這里不使用也可以 #如果使用(),表示表達(dá)式是有n個(gè)組的,所以要使用groups() m=re.match(r'(\d{3})-(\d{3,8})','010-12345') print m.groups()#('010', '12345') print m.group(0)#010-12345 默認(rèn)組0,組0包含整個(gè)字符串 print m.group(1)#010 組1包含第一個(gè)()內(nèi)的正則 print m.group(2)#123456 組2包含第二個(gè)()內(nèi)的正則2. 分割字符應(yīng)用
p=re.compile(r'd+') p.split('one1two22three333four') #['one', 'two', 'three', 'four']兩種方法,先compile后,就不用每次都運(yùn)行compile了
ss="hello,what,is,,,,,,your,,name" import re sss=re.split('[,]+',ss) print sss#等同于 pa=re.compile('[,]+') aaa=pa.split(ss) print aaa?
3替換應(yīng)用,最突出的就是和組結(jié)合使用
re.sub()
?
4貪婪匹配
將貪婪比配轉(zhuǎn)換成非貪婪模式?,這里注意?的位置啊
ss='*mili*is*great*' #貪婪模式 pa=re.compile(r'\*(.+)\*') print pa.match(ss).group(0) #*mili*is*great* 世界只想匹配*mili*,貪婪盡可能多的東西匹配#非貪婪模式,匹配到就停止
pa1=re.compile(r'\*(.+?)\*') #這里注意下?的位置啊(.+)?這個(gè)?指的是0次或者1次,不一樣的 print pa1.match(ss).group(0) #*mili*
?
5 re.sub替換,模式替換
#替換re.sub強(qiáng)大之處就在于替換中使用組號(hào),默認(rèn)整個(gè)字符創(chuàng)是group(0),\1第一個(gè)()group(1) #re.sub(pa,repl,string,count=0) 用repl替換pa匹配的地方 print help(re.sub) ss='hello, *world*' pa=re.compile(r'\*([^\*]+)\*') #匹配不以*開頭的字符串,^需要[^]使用 print re.sub(pa,'hahahaha',ss) #hello, hahahaha pa1=re.compile(r'\*([^\*]+)\*') print re.sub(pa,r'<h1>\1</h1>',ss) #\1第一個(gè)()group(1) hello, <h1>world</h1>?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/xueli/p/3709560.html
總結(jié)
以上是生活随笔為你收集整理的python中的re模块和正则表达式基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软Expression Blend功能
- 下一篇: exception:Deleted ro