Python 正規表示式

2021-07-23 08:40:38 字數 4979 閱讀 4297

正規表示式為高階文字模式匹配,以及搜尋-替代等功能提供了基礎。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模組的講解很簡單易懂,內容不多但起碼把人領進門了,...