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