1. 程式人生 > >python 正則表示式學習

python 正則表示式學習


 

re.match()函式:

 

函式語法: re.mathch ( pattern , string , flags = 0)

引數說明:

pattem

匹配的正則表示式

string

要匹配的字串

flags

標誌位,用於控制正則的匹配方式;如大小寫區分,多行匹配等

匹配成功 re.match 方法返回一個匹配的物件(object),否則返回None

可以使用group(num)

groups()匹配物件函式來獲取匹配表示式

group(num)

匹配整個表示式的字串,可以一次輸入多個組號,在這種情況下將返回一個包含那些組所對應值得元組

group( )

返回一個包含那些小組字串得元組,從1到所含得小組號

例項:

>>> import re

>>> print(re.match('www','www.google.com').span())  #在起始位匹配

(0, 3)

>>> print
(re.match('com','www.google.com'))#不在起始位匹配 None

 

 

例項:

>>> import re

>>> line = "Cats are smarter than dogs"

>>> # .* 表示任意匹配除換行符(\n \r)之外的任何單個或多個字元

>>> match0bj = re.match(r'(.*)are(.*?).*',line,re.M|re.I)

>>> if match0bj:

print('match0bj.group():
',match0bj.group()) print('match0bj.group(1):',match0bj.group(1)) print('match0bj.group(2):',match0bj.group(2)) >>> else: print('No match!!!') match0bj.group(): Cats are smarter than dogs match0bj.group(1): Cats match0bj.group(2):

 


re.search()函式:掃描整個字串並返回第一個成功的匹配

 

函式語法: re.search( pattern , string , flags=0 )

 

引數說明:

pattem

匹配的正則表示式

string

要匹配的字串

flags

標誌位,用於控制正則的匹配方式;如大小寫區分,多行匹配等

匹配成功 re.match 方法返回一個匹配的物件(object),否則返回None

可以使用group(num)groups()匹配物件函式來獲取匹配表示式

group(num)

匹配整個表示式的字串,可以一次輸入多個組號,在這種情況下將返回一個包含那些組所對應值得元組

group( )

返回一個包含那些小組字串的元組,從1到所含得小組號

例項:

>>> import re

>>> print(re.search('www','www.google.com').span())#在起始位匹配

(0, 3)

>>> print(re.search('com','www.google.com'),span())#不在起始位匹配

(11, 14)

 

 

re.matchre.search的區別:

re.match 只匹配字串的開始,如果字串開始不符合正則表示式,則匹配失敗,函式返回None;而 re.search匹配整個字串,直到找到一個匹配。

>>> import re

>>> line = 'Cats are smarter than dogs'

>>> match0bj = re.match( r'dogs',line,re.M|re.I)

>>> if match0bj:

print("match --> match0bj.group():",match0bj.group())

else:

print("No match!!!")

 

No match!!!

>>> match0bj = re.search(r'dogs',line,re.M|re.I)

>>> if match0bj:

print("match --> match0bj.group():",match0bj.group())

else:

print("No match!!!")

 

match --> match0bj.group(): dogs

 


re.sub()函式:(檢索和替換)用於替換字串中的匹配項

 

語法:    re.sub( pattern , rep1 , string , coun=0 )

引數:

pattern

正則中的模式字串

repl

替換的字串,也可為一個函式

string

要被查詢替換的原始字串

count

模式匹配後替換的最大次數,預設0表示替換所有的匹配

例項:

>>> import re

>>> phone = '2004-959-559  # 這是一個號碼'

>>> #刪除註釋

>>> num = re.sub (r'#.*$',"",phone)

>>> print("電話號碼:",num)

電話號碼: 2004-959-559  

>>> #移除非數字的內容

>>> num = re.sub(r'-',"",phone)

>>> print("電話號碼:",num)

電話號碼: 2004959559  # 這是一個號碼

 

repl引數是一個函式:

>>> import re

>>> #將匹配的數字乘於 2

>>> def double(matched):

value = int(matched.group('value'))

return str(value * 2)

 

>>> s = 'A23G4HFD567'

>>> print(re.sub('(?P<value>\d+)',double,s))

A46G8HFD1134

 


re.compile()函式:

用於編譯正則表示式,生成一個正則表示式(Pattern)物件,供match()search()這兩個函式使用!

 

語法格式:    re.compile( pattern [, flags ] )

 

 

引數:

pattem

一個字串形式的正則表示式

flags

(可選)表示匹配模式,比如忽略大小寫,多行模式等

具體引數:

re.I

忽略大小寫

re.L

表示特殊字符集\w,\W,\b,\B,\s,\S 依賴當前環境

re.M

多行模式

re.S

即‘ . ’並且包括換行符在內的任意字元(‘ . ’不包括換行符)

re.U

表示特殊字符集\w,\W,\b,\B,\s,\S依賴於Unicode字元屬性資料庫

re.X

為了增加可讀性,忽略空格和‘ # ’後面的註釋

 

例項:

>>> import re

>>> pattern = re.compile(r'\d+')

>>> m = pattern.match('one12twothree34four') #查詢頭部,沒有匹配

>>> print(m)

None

>>> m = pattern.match('one12twothree34four',2,10)  #從e的位置開始匹配,沒有匹配

>>> print(m)

None

>>> m = pattern.match('one12twothree34four',3,10)#從1的位置開始匹配,正好匹配

>>> print(m)#返回一個 Match 物件

<_sre.SRE_Match object; span=(3, 5), match='12'>

 

>>> m.group(0)#可省略 0

'12'

>>> m.start(0)#可省略 0

3

>>> m.end(0)#可省略 0

5

>>> m.span(0)#可省略 0

(3, 5)

 

 

在例項中,當匹配成功返回一個Match物件,其中:

group([group1,...])

用於獲得一個或多個分組匹配的字串,當要獲得整個匹配的子串時,可直接使用group()group(0)

start([group])

用於獲取分組匹配的子串在整個字串中的起始位置(子串第一個字元索引)預設 0

end([group])

獲取分組匹配的子串在整個字串中的結束位置(子串最後一個字元的索引+1)預設0

span([group])

返回(startgroup),end(group)

例項+

>>> import re

>>> pattern = re.compile(r'([a-z]+) ([a-z]+)',re.I)#re.I表示忽略大小寫

>>> m = pattern.match('hello world wide web')

>>> print (m)#匹配成功,返回一個 Match 物件

<_sre.SRE_Match object; span=(0, 11), match='hello world'>

>>> m.group(0)#返回匹配成功的整個字串

'hello world'

>>> m.span()#返回匹配成功的整個子串的索引

(0, 11)

>>> m.group(1)#返回第一個分組匹配成功的子串

'hello'

>>> m.span (1)#返回第一個分組匹配成功的子串的索引

(0, 5)

>>> m.group(2)#返回第二個分組匹配成功的子串

'world'

>>> m.span (2)#返回第二個分組匹配成功的子串的索引

(6, 11)

>>> m.groups()#等價於 (m.group(1),m.group(2), ...)

('hello', 'world')

>>> m.group(3)#不存在第三個分組——報錯error

Traceback (most recent call last):

  File "<pyshell#12>", line 1, in <module>

    m.group(3)

IndexError: no such group

 

findall()函式:

在字串中找到正則表示式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的則返回空list

注意:matchsearch是匹配一次/findall匹配所有。

 

語法格式:    findall( string[, pos[, endpos]])

 

引數:

string

待匹配的字串

pos

可選引數,指定字串的起始位置(預設 0

endpos

可選引數,指定字串的結束位置,(預設字串總長度)

例項:

>>> import re

>>> pattern = re.compile(r'\d+') #查詢數字

>>> result1 = pattern.findall('runoob 123 google 456')

>>> result2 = pattern.findall('run88oob123google456',0,10)

      

>>> print(result1)

['123', '456']

>>> print(result2)

['88', '12']

 

 

re.finditer()函式:

——和findall類似,在字串中找到正則表示式所匹配的所有子串,並把他們作為一個迭代器返回。

 

語法格式:    re.finditer( pattern, string, flags=0 )

 

引數:

pattern

匹配的正則表示式

string

要匹配的字串

flags

標誌位

例項:

>>> import re

>>> it = re.finditer(r'\d+','12a32bc43jf3')

>>> for match in it:

print(match.group())

 

12

32

43

3

 

 

re.split()函式:

split方法按照能夠匹配的子串將字串分割後返回列表list,語法如下:

  re.split( pattern, string[,maxsplit=0, flags=0])

引數:

pattern

匹配的正則表示式

string

要匹配的字串

maxsplit

分隔次數,maxsplit=1>>分隔一次,預設為0 不限次數

flags

標誌位

例項:

>>>import re

>>> re.split('\W+', 'runoob, runoob, runoob.')

['runoob', 'runoob', 'runoob', '']

>>> re.split('(\W+)', ' runoob, runoob, runoob.')

['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']

>>> re.split('\W+', ' runoob, runoob, runoob.', 1)

['', 'runoob, runoob, runoob.']

>>> re.split('a*', 'hello world') #對於一個找不到匹配的字串而言,split 不會對其作出分割

['hello world']

 

 


正則表示式物件:

·re.compile() 返回 RegexObject 物件

·re.MatchObject

group()返回被RE匹配的字串

——start() :返回匹配開始的位置

—— end() :返回匹配結束的位置

——span() :返回一個元組包含匹配(開始,結束)的位置

 

正則表示式修飾符——可選標誌:

正則表示式可以包含一些可選標誌修飾符來控制匹配的模式;修飾符被指定為一個可選的標誌;多個標誌可 以通過按位 ORI)它們來指定。(如re.I | re.M 被設定成IM標誌):

修飾符

作用

re.I

使匹配大小寫不敏感(忽略大小寫)

re.L

做本地化識別(locale-aware)匹配

re.M

多行匹配,影響  ^ 和 $

re.S

使 . 匹配包括換行在內的所有字元

re.U

根據Unicode字符集解析字元,這個標誌影響\w,\W,\b,\B

re.X

該標誌通過給予你更靈活的格式以便你將正則表示式寫的更易於理解

 

正則表示式模式:

·模式字串使用特殊的語法來表示一個正則表示式;

·字母和數字表示他們自身;一個正則表示式模式中的字母和數字匹配同樣的字串;

·多數字母和數字前加一個反斜槓時會擁有不同的含義;

·標點符號只有被轉義時才匹配自身,否則它們表示特殊的含義;

·反斜槓本身需要使用反斜槓轉義;

·由於正則表示式通常都包含反斜槓,所以你最好使用原始的字串來表示它們。

·模式元素: r'\t' 等價於 \\t  匹配相應的特殊字元;

·下表列出了re表示式模式語法中的特殊元素。如果你使用模式的同時提供了可選的標誌引數,某些模式 元素的含義會該改變:

模式

作用

^

匹配字串的開頭

$

匹配任意字元,除了換行符,當DOTALL標記被指定時,則可以匹配包括換行符的任意字元

[...]

用來表示一組字元,單獨列出:[amk]匹配’a’,’m’或’k’

[^...]

不在[]中的字元:[^abc]匹配除了a,b,c之外的字元

re*

匹配0個或多個的表示式

re+

匹配1個或多個的表示式

re?

匹配0個或1個由前面的正則表示式定義的片段,非貪婪方式

re{ n}

匹配n個前面表示式(例如:”o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的“o”)

re{ n,}

精確匹配n個前面表示式。例如,"o{2,}"不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o"o{1,}"等價於"o+""o{0,}"則等價於"o*"

re{n,m}

匹配 n m 次由前面的正則表示式定義的片段,貪婪方式

a|b

匹配ab

(re)

匹配括號內的表示式,也表示一個組

(?imx)

正則表示式包含三種可選標誌:i,mx —隻影響括號中的區域

(?-imx)

正則表示式關閉im,或x可選標誌

(?:re)

類似(...),但是不表示一個組

(?imx:re)

在括號內使用imx 可選標誌

(?-imx:re)

在括號內不使用imx 可選標誌

(?#...)

註釋

(?=re)

前向肯定界定符。如果所含正則表示式,以 ... 表示,在當前位置成功匹配時成功,否則失敗。但一旦所含表示式已經嘗試,匹配引擎根本沒有提高;模式的剩餘部分還要嘗試界定符的右邊

(?!re)

前向否定界定符。與肯定界定符相反;當所含表示式不能在字串當前位置匹配時成功。

(?>re)

匹配的獨立模式,省去回溯。

 

 

\w

匹配數字字母下劃線

\W

匹配非數字字母下劃線

\s

匹配任意空白字元(等價於\t \n \r \f

\S

匹配任意非空字元

\d

匹配任意數字(等價於[0-9]

\D

匹配任意非數字

\A

匹配字串開始

\Z

匹配字串結束(如果存在換行,只匹配到換行前的結束字元)

\z

匹配字串結束

\G

匹配最後匹配完成的位置

\b

匹配一個單詞邊界,也就是指單詞和空格間的位置(例如:‘er\b’可以匹配“never”中的‘er’但不能匹配“verb”中的‘er

\B

匹配非單詞邊界(例如:'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'

\n \t

匹配一個換行符,匹配一個製表符等

\1...\9

匹配第n個分組的內容

\10

匹配第n個分組的內容,如果它經匹配;否則指的時八進位制字元碼的表示式

 

正則表示式例項:

字元匹配:

[Pp]ython

匹配“Python”或“python

rub[ye]

匹配“ruby”或“rube

[aeiou]

匹配中括號內任意一個字母

[0-9]

匹配任何數字

[a-z]

匹配任何小寫字母

[A-Z]

匹配任何大寫字母

[a-zA-Z0-9]

匹配任何數字和字母

[^aeiou]

除了aeiou字母以外的所有字元

[^0-9]

匹配除了數字以外的字元

特殊字元類:

 .

匹配除“\n”之外的任何單個字元,匹配“\n”之內的使用“ [.\n] ”模式

\d

匹配一個數字字元

\D

匹配一個非數字字元

\s

匹配任何空白字元

\S

匹配任何非空白字元

\w

匹配包含下劃線的任何單詞字元

\W

匹配任何非單詞的字元