工作原理:通過一些特定的字符去匹配你想要的內容,將與設定規則匹配的內容返回,不匹配的內容過濾,即不返回。
匹配字符
- 普通字符
例如: test 與 'test' 匹配
- 元字符
. ^ $ * + ? {} [] \ | ( )
定義正則表達式:
正則名 = r ' 正則內容 '
實例:
rule = r'test'
解釋:定義一個名爲rule的正則,其功能是匹配test字符串.
下面開始講解正則表達式的元字符:
[] 字符集:
-常用於匹配某一個字符集:如[a-z]; [A-Z] ; [0-9] ...
-元字符在字符集中不起作用,只相當於普通字符:如[abc$ ] ; [ hello* ]...
-擴展:匹配字符集以外的字符(補集匹配):[^abc]...特點:以^符號開頭
實例如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
r = r'[a-c]test' #制定一個首位字符爲'a-c'區間的正則
print re.findall(r,'atest')
print re.findall(r,'ctest')
print re.findall(r,'dtest')
運行輸出:
['atest']
['ctest']
[]
可見,以d開頭的字符串‘dtest’被過濾掉了。
補集匹配:
補集匹配時需要配合字符集[]來使用,當使用字符集[]時,其內部的首位爲^時,表示除了字符集以內的所有內容:
實例如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
r = r'[^xy]' # 除 x y 以外的字符
print re.findall(r,'x')
print re.findall(r,'xy')
print re.findall(r,'xyabc')
print re.findall(r,'xiyjk')
實例輸出:
[]
[]
['a', 'b', 'c']
['i', 'j', 'k']
解釋:定義補集正則,此時除了 xy以外的內容,其它內容都進行輸出,與其位置無關。
^ 匹配行首:
主要用於匹配字符串的頭部(開始)的字符,匹配則輸出,不匹配則過濾掉。
實例如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
r = r'^head' # 輸出以‘ head ’開始的字符串
print re.findall(r,'head')
print re.findall(r,'headfile')
print re.findall(r,'heartkkk')
print re.findall(r,'heaaaabb')
實例輸出:
['head']
['head']
[]
[]
匹配頭部爲head的字符串,有則輸出該頭部信息,沒有則不輸出。
$ 匹配行尾:
用於匹配字符串的尾部(末端)的字符,匹配則輸出,不匹配則過濾掉。
實例如下:
#!/usr/bin/python
#-*- coding: utf-8 -*-
importre
r= r'end$' # 制定以'end'結尾的字符串
printre.findall(r,'end')
printre.findall(r,'abcend')
printre.findall(r,'iiienn')
printre.findall(r,'hello python')
實例輸出:
['end']
['end']
[]
[]
\ 轉義字符:
正則表達式中與其它語言一樣使用\進行字符轉義,其內部也提供了一些常用的轉義字符。
同時可以使用\字符取消所有的元字符,如:\$ , \* ,\+ …...
內部轉義字符:
\d:匹配任何十進制數: 相當於字符集 [0-9]
\D:匹配任何非數字字符: 相當於字符集[^0-9]
\s:匹配任何空白字符: 相當於字符集[\t\n\r\f\v]
\S:匹配任何非空白字符: 相當於字符集[^\t\n\r\f\v]
\w:匹配任何字母數字字符:相當於字符集[a-aA-Z0-9]
\W:匹配任何非字母數字字符:相當於字符集[^a-aA-Z0-9]
實例如下:
功能:將元字符 $ 轉換爲普通字符
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
r = r'\$abc' # 將'$'元字符轉義爲普通字符
print re.findall(r,'abc')
print re.findall(r,'$abc')
運行輸出:
[]
['$abc']
內部提供轉義字符實例:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
r = r'\dyear' # 用 \d 代替 [0-9]
print re.findall(r,'2year')
print re.findall(r,'dyear')
運行輸出:
['2year']
[]
* 匹配0次或以上:
用於指定前一個字符可以被匹配零次或 以上次數,匹配引擎會本着重複儘可能多次數去匹配,一般配合字符集[]使用。
例如:a[xyz]*b
表示:匹配以'a'開始,‘b’結束,中間是'x''y''z'字符中的任意字符、任意組合及任意次數的組合的字符。
實例如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
r = r'hello*' # 用 * 號制定 o 必須出現 零次或以上
print re.findall(r,'hel')
print re.findall(r,'hell')
print re.findall(r,'hello')
print re.findall(r,'helloo')
運行輸出:
[]
['hell']
['hello']
['helloo']
+ 匹配1次或以上:
用於指定前一個字符可以被匹配一次或 以上次數,與*字符不一樣的就是+字符必須需要指定的字符必須出現一次,而*字符可以是0次。
實例如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
r = r'hello+' # 用 + 號制定 o 必須出現 一次或以上
print re.findall(r,'hell')
print re.findall(r,'hello')
print re.findall(r,'helloo')
運行輸出:
[]
['hello']
['helloo']
? 可選匹配:
指定某一字符或區間字符進行匹配一次或零次,即可有可無的狀態。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
r = r'ab?c' # 指定 b 可有可無
print re.findall(r,'ac')
print re.findall(r,'abc')
print re.findall(r,'abbc')
運行輸出:
['ac']
['abc']
[]
拓展延伸:
貪婪模式和非貪婪模式,貪婪模式爲最大匹配,非貪婪模式則爲最小匹配!
實例如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
r = r'ab*' # 貪婪模式(最大匹配)
s = r'ab*?' # 非貪婪模式(最小匹配)
print re.findall(r,'abbbbbb')
print re.findall(s,'abbbbbb')
運行輸出:
['abbbbbb']
['a']
{m,n} 區間限定符:
表示將某一字符限定在某一區間內,該限定符的規則爲至少重複m次,最多重複n次。其中m,n均爲整數。
當忽略m時,默認下邊界(至少)爲0,而忽略n時,默認上邊界(至多)爲無窮(0~20億次)。
實例如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
r = r'ab{2,5}c' # 指定 b 重複次數在 2~5 次之間
print re.findall(r,'abc') #重複 1 次
print re.findall(r,'abbc') #重複 2 次
print re.findall(r,'abbbbbc') #重複 5 次
print re.findall(r,'abbbbbbc') #重複 6 次
運行輸出:
[]
['abbc']
['abbbbbc']
[]