python,詳說正規表示式(對常用的關鍵字元的講解)

__simple發表於2016-06-10

官方網址

模組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匹配任何空白字元,它相當於類[

fv]
⑷w匹配任何字母數字字元,它相當於類[a-zA-Z0-9]
⑸W匹配任何非字母數字字元,它相當於類[^a-zA-Z0-9]

7.重複問題
如果你匹配一個電話號碼,對於個數,你重複使用d是很麻煩的,這個怎麼解決

import re
n=`18829789854`
r=r`^1dddddddddd`
print re.findall(r,n)

解決辦法:使用{number},number表示重複次數

import re
n=`18829789854`
r=r`^1d{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.如果匹配的時候,遇到
等轉義字元時,正則不會認為是轉義字元,所有在編譯的時候,這樣做
re.compile(正規表示式,re.S)

import re
r=re.compile(r`.net`,re.S)
print r.findall(`
net`)        

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`]


相關文章