正規表示式為高階文字模式匹配,以及搜尋-替代等功能提供了基礎。python通過re模組支援正規表示式。
在python專門術語中,有兩種主要方法完成模式匹配:搜尋(searching)和匹配(matching),搜尋,即在字串任意部分中搜尋匹配的模式,而匹配是指,判斷乙個字串能否從起始處全部或者部分的匹配某個模式。搜尋通過search()函式或者方法來實現,而匹配是以match()函式或者方法來實現的。
核心函式和方法
re.match(pattern, string[, flags]):
m1=re.match("[0-9]","12312312szdfafs567sadf") #匹配0到10個連續的數字
print m1 #<_sre.sre_match object at>
if m1:
print m1.group() #12312312
****
****
****
****
****
****
****
****
*****
m1=re.match("[0-9]","12312312szdfafs567sadf") #匹配10個連續的數字數字
print m1 #none,因為12312312這個沒有10個
if m1:
print m1.group()
這個方法將從string的開始處起嘗試匹配pattern;如果pattern結束時仍可匹配,則返回乙個match物件;如果匹配過程中pattern無法匹配,或者匹配未結束就已到達結尾,則返回none。
re.search(pattern, string[, flags]):
m2=re.search("\d","a75_46.5 4a~bc6@def") #從左開始乙個乙個查詢
if m2:
print m2.group() #7
這個方法用於查詢字串中可以匹配成功的子串。從string的開始處起嘗試匹配pattern,如果pattern結束時仍可匹配,則返回乙個match物件;若無法匹配,則將下標加1後重新嘗試匹配;直到到結尾時仍無法匹配則返回none。
>>> m=re.match("\d+","12assd3124") #從頭開始查詢,有匹配的就返回,沒有就none
>>>
print m
<_sre.sre_match object at>
>>> m.group()
'12'
>>> m=re.match("\d+","asd12assd3124")#開頭不是數字,匹配失敗,返回none
>>> m.group()
traceback (most recent call last):
file "", line 1, in
attributeerror: 'nonetype' object has no attribute 'group'
>>> m=re.search("\d+","asd12assd3124")#開頭不是數字,索引加1在匹配,匹配到乙個就返回,索引到末尾還沒有匹配就返回none
>>> m.group()
'12'
>>>
>>> m=re.search("\d+","asdqweqweqwe")
>>>
print m
none
>>>
re.findall(pattern, string[, flags]):
m2=re.findall("[a-za-z]","14123sasdasdcv3434234")#匹配所有的單個字母
print m2 #['s', 'a', 's', 'd', 'a', 's', 'd', 'c', 'v']
m2=re.findall("[a-za-z]","14123sasdasdcv3434234")
print m2 #['sasda', 'sdcv'] 貪吃原則,先匹配最長的,即先匹配5個字元,剩下的
m2=re.findall(".","14123sasdasdcv3434234") #匹配任意單個字元
print m2 #['1', '4', '1', '2', '3', 's', 'a', 's', 'd', 'a', 's', 'd', 'c', 'v', '3', '4', '3', '4', '2', '3', '4']
m2=re.findall(".*","14123sasdasdcv3434234") #匹配任意多(0到無窮)個任意字元
print m2 #['14123sasdasdcv3434234', ''] 為什麼有空的,因為0個也算是乙個
m2=re.findall(".+","14123sasdasdcv3434234") #匹配任意多(1到無窮)個任意字元
print m2 #['14123sasdasdcv3434234']
搜尋string,以列表形式返回全部能匹配的子串。
re.sub(pattern, repl, string[, count]):
m2=re.sub("\d",'|',"a75_46.5 4a~bc6@def",count=2) #將前兩個數字替換成「|」,
print m2 #a||_46.5 4a~bc6@def
使用repl替換string中每乙個匹配的子串後返回替換後的字串。
當repl是乙個字串時,可以使用\id或\g、\g引用分組,但不能使用編號0。
當repl是乙個方法時,這個方法應當只接受乙個引數(match物件),並返回乙個字串用於替換(返回的字串中不能再引用分組)。
count用於指定最多替換次數,不指定時全部替換。
re.split(pattern, string[, maxsplit]):
import re
print re.split('\d+','one1two2three3four4')
### output ###
# ['one', 'two', 'three', 'four', '']
按照能夠匹配的子串將string分割後返回列表。maxsplit用於指定最大分割次數,不指定將全部分割。
匹配物件和group(),groups()方法
在處理正規表示式的時候,除了regex物件之外,還有一種物件型別匹配物件,這些物件是在match()或者search()被成功呼叫後返回的結果,匹配物件主要有兩種方法,group(),groups()
group()方法或者返回所有的匹配物件或是根據要求返回某個特定子組。groups()很簡單,他返回乙個包含唯一或者所有子組的元組。
用於練習的資料生成**
from random import randint,choice
from string import lowercase
from sys import maxint
from time import ctime
doms=('com','edu','net','org','gov')
for i in range(randint(5,10)):
dtint=randint(0,maxint-1)
dtstr=ctime(dtint)
shorter=randint(4,7)
em=''
for j in range(shorter):
em+=choice(lowercase)
longer=randint(shorter,12)
dn=''
for j in range(longer):
dn+=choice(lowercase)
sun may 03 19:31:12 1992::[email protected]::704892672-5-7
mon apr 08 13:27:52 2002::[email protected]::1018243672-7-11
wed may 24 12:18:11 2017::[email protected]::1495599491-6-9
tue may 16 12:01:36 2000::[email protected]::958449696-6-8
sat jan 19 18:14:04 2036::[email protected]::2084350444-5-10
fri jan 12 01:07:32 2035::[email protected]::2052148052-6-12
thu aug 15 23:51:19 2002::[email protected]::1029426679-6-11
fri jun 18 08:45:36 2032::[email protected]::1971132336-6-11
用生成的這些字串進行匹配練習
待續
匹配email位址的正規表示式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
匹配url的正規表示式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?
匹配html標記的正規表示式:/.*|/
驗證url:^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$
驗證使用者密碼:^[a-za-z]w$ 正確格式為:以字母開頭,長度在6-18之間
python正規表示式元字元 正規表示式
字元 描述將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...
Python 正規表示式
1.在python中,所有和正規表示式相關的功能都包含在re模組中。2.字元 表示 字串的末尾 如 road 則表示 只有當 road 出現在乙個字串的尾部時才會匹配。3.字元 表示 字元中的開始 如 road 則表示 只有當 road 出現在乙個字串的頭部時才會匹配。4.利用re.sub函式對字串...
Python正規表示式
學習python自然而然就不得不面對正規表示式這個難題。當初在沒有學習python之前,自己也曾經嘗試著學習過正規表示式,但是那時候感覺很麻煩,很難懂,結果就是不了了之。但是現在學習python我用的書是 python基礎教程 第二版 這本書中對re模組的講解很簡單易懂,內容不多但起碼把人領進門了,...