模塊re { re模塊提供了一個正則表達式引擎的接口,可以讓你將REstring編譯在對象並用它們來進行匹配 } 疑問:字符串前加r的作用,反斜槓就不會被任何特殊處理 { 編譯標誌-flages dotall[s],使匹配包括換行在內的所有字符 ignorecase[I],使匹配對大小寫不敏感 locale[L],做本地化識別(locale-aware)匹配法語等 multiline[M],多行匹配,影響^和$ varbose[X],能夠使用REs的verbose狀態,使之被組織得更清晰易懂 }
1.[...]用來表示一組字符,單獨列出:[io] 匹配 'i',或'o'
import re s='tip top' r=r't[io]p' a=re.findall(r,s) print a
[...]如果匹配的是個範圍,可以這個寫[0-9a-zA-B]表示0到9並a到z並A到B
2.^ ⑴不在[]中的字符:[^io] 匹配除了i,o之外的字符
import re s='tip top' r=r't[^io]p' a=re.findall(r,s) print a
⑵匹配開頭的字符串
import re s='ahello hello' r=r'^hello' a=re.findall(r,s) print a
3.$ 匹配後面的字符串
import re s='hello hello' r=r'hello$' a=re.findall(r,s) print a
4.[...^...] *"除了寫在開頭地方" *和[..$...]或[$...]或[...$]這個沒有什麼作用,只會當作一般字符來處理
5.如果匹配字符串abc,就會出現問題,因爲是特殊字符
import re s='^abc ^abc ^abc' r=r'^abc' a=re.findall(r,s) print a
出現上面問題,可以這樣解決,通過一個轉義字符
import re s='^abc ^abc ^abc' r=r'\^abc' a=re.findall(r,s) print a
6. -反斜槓排布可以加不同的字符以表示不同特殊意義 -也可以用於出污泥而不染所有的元字符:[或\ ⑴\d匹配任何十進制數,它相當於類[0-9] ⑵\D匹配任何非數字字符,它相當於類[^0-9] ⑶\s匹配任何空白字符,它相當於類[\t\n\r\f\v] ⑷\w匹配任何字母數字字符,它相當於類[a-zA-Z0-9] ⑸\W匹配任何非字母數字字符,它相當於類[^a-zA-Z0-9]
7.重複問題 如果你匹配一個電話號碼,對於個數,你重複使用\d是很麻煩的,這個怎麼解決
import re n='18829789854' r=r'^1\d\d\d\d\d\d\d\d\d\d' print re.findall(r,n)
解決辦法:使用{number},number表示重複次數
import re n='18829789854' r=r'^1\d{10}$' #對於電話號碼前面和後面不能現出現別的字符,所以使用^和$ print re.findall(r,n)
8.* 指定前一個字符可以被匹配零次或更多次,而不是隻有一次。匹配引擎會試着重複儘可能我的次數(不超過整數辦公室範圍,20億)
import urllib,re h=urllib.urlopen('http://www.baidu.com') s=h.read() r='www.\w*.com' #兩個.之間想匹配多個字母或數字 li=re.findall(r,s) for i in li: print i
9.+ 這和*的區別就是,這個最少一次也就是,匹配前面的字符(次數>=1),所有對於網址匹配,就應該使用+號
import urllib,re h=urllib.urlopen('http://www.baidu.com') s=h.read() r='www.\w+.com' #兩個.之間不會出現0次 li=re.findall(r,s) for i in li: print i
10.? ⑴表示前面的符號重複一次或零次 ⑵表示最小匹配數,如果想得到ab的最短匹配
import re s='abbbbbbb' r=r'ab+' print re.findall(r,s)
最短:
import re s='abbbbbbb' r=r'ab+?' print re.findall(r,s)
還有一個作用:
import re r=r'(?:\d{1}){2}' #讓組裏面的內容連着再次 s='fas14214jiojoi2412' str_re=re.compile(r) print str_re.findall(s)
11.如果想匹配前面的符號有一定的範圍的話就使用{m,n}
import re s='abbbb' r=r'ab{1,3}' #表示b的次數出現1次到3次,包括1和3 print re.findall(r,s)
12.如果你的正則表達式,反覆使用就先提前編譯好,這樣可以提高運行效率,代碼如下
import re r=re.compile(r'ab') #把正則表達式提前編譯好 print r.findall(字符串)
13.如果在匹配的時候,想大小寫都可以匹配的話,在編譯的時候可以這樣
- re.compile(正則表達式,re.I) #re.I表示忽略大小寫
14.方法
- match() 決定RE是否在字符串起始的位置匹配
- search() 掃描字符串,找到這個RE匹配的第一次的位置 #前兩個返回的是一個對象,如果想看到結果
import re s=' aab' r=re.compile(r'ab') t=r.search(s) print t.group()
goups()分組
import re r=r'(\d)\w*(\d)' s='fas14214jiojoi2412' str_re=re.compile(r) str_object=str_re.search(s) print str_object.groups() #以元組輸出分組的結果
- findall() 找到RE匹配的所有子串,並把它們作爲一個列表返回
- finditer() 找到RE匹配的所有子串,並把它們作爲一個迭代器返回 #返回一個迭代器對象
15.MatchObject(match對象)
- group() 返回被RE匹配的字符串
- start() 返回匹配開始的位置
- end() 返回匹配結束的位置
- span() 返回一個元組包含匹配(開始,結束)的位置
16.如果想把某個符合正則表達式的字符串替換,怎樣做?
import re s=' aab' r=re.compile(r'ab') t=r.sub('AB',s) #'AB'是把符合正則表達式的字符換掉 print t
還有一個函數,subn()返回字符串,並且返回更改的個數
17.想把符合正則表達式的內容分割
import re s=' 1+2-3*4/5' r=re.compile(r'[\+\-\*/]') #因爲+-*都是特殊字符所有要加上\ t=r.split(s) print t
18 .(點) 匹配任意字符,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字符。
19.如果匹配的時候,遇到\n等轉義字符時,正則不會認爲是轉義字符,所有在編譯的時候,這樣做 re.compile(正則表達式,re.S)
import re r=re.compile(r'.net',re.S) print r.findall('\nnet')
19.如果對多行字符串的處理的話,可以使用到re.M,比如:對於文件處理
import re s=''' ab abc abcd ''' r=re.compile(r'^a',re.M) print r.findall(s)
18.對於正則表達式,寫在多行時,就要使用re.X
import re rn=r''' a ''' s='a' r=re.compile(rn,re.X) print r.findall(s)
19.分組,對於字符串片段進行選擇,使用(...|...|....) 實例1:
import re s='www.baidu.cn' r=re.compile(r'www\.\w+\.(com|cn)',re.X) print r.match(s)
如果使用findall()進行匹配時,會出現下面現象
import re s='www.baidu.cn' r=re.compile(r'www\.\w+\.(com|cn)',re.X) print r.findall(s)
結果: ['cn']
返回了分組的內容
實例2:
import re s='name=1 name=2' r=re.compile(r'name=(\d)',re.X) print r.findall(s)
結果: ['1', '2']