python,詳說正則表達式(對常用的關鍵字符的講解)

官方網址

模塊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']

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章