1. 程式人生 > >正則表達式中pattern.match(),re.match(),pattern.search(),re.search()方法的使用和區別

正則表達式中pattern.match(),re.match(),pattern.search(),re.search()方法的使用和區別

pil 多行 findall 什麽 大小寫 python python語言 one 文本

正則表達式(regular expression)是一個特殊的字符序列,描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子串。

將匹配的子串替換或者從某個串中取出符合某個條件的子串,或者是在指定的文章中抓取特定的字符串等。Python處理正則表達式的模塊是re模塊,它是Python語言中擁有全部的正則表達式功能的模塊。正則表達式由一些普通字符和一些元字符組成。普通字符包括大小寫的字母、數字和打印符號,而元字符是具有特殊含義

正則表達式大致的匹配過程是:

拿正則表達式依次和字符串或者文本中的字符串做比較,如果每一個字符都匹配,則匹配成功,只要有一個匹配不成功的字符,則匹配不成功。

技術分享圖片

正則表達式模式

正則表達式是一種用來匹配字符串得強有力的武器。

它的設計思想是用一種描述性的語言來給字符串定義一個規則,凡是符合規則的字符串,我們就認為它“匹配”了,否則,就是匹配不成功。

模式字符串使用特殊的語法來表示一個正則表達式:
字母和數字匹配它們自身;
多數字母和數字前加一個反斜杠(\)時會有特殊的含義;
特殊的標點符號,只有被轉義以後才能匹配自身;
反斜杠本身需要反斜杠來轉義;


註意:
由於正則表達式通常包含反斜杠等特殊字符,所以我們最好使用原始字符串來表示他們。如:r’\d’,等價於’\\d’,表示匹配一個數字。
Python正則表達式中,數量詞默認都是貪婪的,它們會盡力盡可能多的去匹配滿足的字符,但是如果我們在後面加上問號“?”,就可以屏蔽貪婪模式,表示匹配盡可能少的字符。如字符串:“xyyyyzs”,使用正則“xy*”,就會得到“xyyyy”;如果使用正則“xy*?”,將只會匹配“x”
下表列出了正則表達式模式語法中的特殊元素。如果你是使用模式的同時提供了可選的標誌參數,某些模式元素含義就會改變。

技術分享圖片

編譯正則表達式基礎

Python通過re模塊提供對正則表達式的支持。使用re的一般步驟是先將正則表達式的字符串形式編譯為pattern實例,然後使用pattern實例處理文本並獲取匹配結果(一個Match實例),最後使用Match實例獲取信息,進行其他的操作。

編輯正則表達式,可以提高程序的執行速度。下面是pattern模式處理正則表達式的流程:

示例代碼:

#coding=utf-8

import re

# 將正則表達式編譯成Pattern對象

pattern = re.compile(r‘hello‘)

# 使用Pattern匹配文本,獲得匹配結果,無法匹配時將返回None

match = pattern.match(‘hello world!‘)

if match:

# 使用Match獲得分組信息

print match.group()

結果:

c:\Python27\Scripts>python task_test.py

hello

正則表達式-- re.compile

re.compile(pattern, flags=0) 這個方法是pattern類的工廠方法,目的是將正則表達式pattern編譯成pattern對象,並返回該對象。 可以把正則表達式編譯成一個正則表達式對象。

可以把那些經常使用的正則表達式編譯成正則表達式對象,這樣可以提高一定的效率。

第二個參數flag是匹配模式,取值可以使用按位或運算符“|”表示同時生效,比如re.I | re.M(忽略大小寫,換行匹配)。

當然你也可以在regex字符串中指定模式,比如:

re.compile(‘pattern‘, re.I | re.M)

它等價於: re.compile(‘(?im)pattern‘)。

re模塊提供了很多用於完成正則表達式的功能。

那為什麽還有使用pattern實例的相應方法替代呢? 使用該pattern模式唯一的好處就是,一處編譯,多處復用。

pattern = re.compile(r‘hello‘)

pattern.match(‘hello world!‘)

以上兩句等價於re.match(r”hello”,”hello world!”)

示例代碼:

#coding=utf-8

import re

# 將正則表達式編譯成Pattern對象

pattern = re.compile(r‘hello‘)

print pattern

# 使用Pattern匹配文本,獲得匹配結果,無法匹配時將返回None

match1 = pattern.match(‘hello world!‘)

if match1:

print u"第一次使用"

# 使用Match獲得分組信息

print match1.group()

match2 = pattern.match("hello, everyone, I am coming.")

if match2 :

print u"第二次使用"

print match2.group()

結果:

c:\Python27\Scripts>python task_test.py

<_sre.SRE_Pattern object at 0x04D5B7A0>

第一次使用

hello

第二次使用

hello

pattern對象下有哪些屬性和方法:

Pattern對象是一個編譯好的正則表達式,也就是通過re.compile()函數編譯後得到結果。

通過pattern提供的一系列方法可以對文本進行匹配查找。

Pattern不能直接實例化,必須使用re.compile()函數進行構造。

pattern提供了幾個可讀屬性及方法用於處理正則表達式。

pattern對象下有哪些屬性和方法:

>>> pattern=re.compile(r"hello")

>>> dir(pattern)

[‘findall‘, ‘finditer‘, ‘flags‘, ‘groupindex‘, ‘groups‘, ‘match‘, ‘pattern‘, ‘scanner‘, ‘search‘, ‘split‘, ‘sub‘, ‘subn‘]

pattern.match()方法:

這個方法將在字符串string的pos位置開始嘗試匹配pattern(pattern就是通過re.compile()方法編譯後返回的對象),如果pattern匹配成功,無論是否達到結束位置endpos,都會返回一個匹配成功後的Match對象;如果匹配不成功,或者pattern未匹配結束就達到endpos,則返回None。

參數說明:

string:被匹配的字符串

pos:匹配的起始位置,可選,默認為0

endpos:匹配的結束位置,可選,默認為len(string)

匹配到的Match對象,我們將使用其具有的group()方法取出匹配結果。

re.match方法從頭開始匹配,匹配不到就返回None

pattern.match和re.match的區別是pattern.match可以指定匹配的起始位置

如:

>>> import re

>>> pattern=re.compile(r"\w+")

>>> pattern.match("qwer123",0,2).group()

‘qw‘

>>> pattern.match("qwer123",0,3).group()

‘qwe‘

re.match()方法

該函數的作用是嘗試從字符串string的起始位置開始匹配一個模式pattern,如果匹配成功返回一個匹配成功後的Match對象,否則返回None。

參數說明:

pattern:匹配的正則表達式

string:要匹配的字符串

flags:標誌位,用於控制正則表達式的匹配方式。如是否區分大小寫、是否多行匹配等。

re.match()方法與pattern.match()方法區別:

re.match()不能指定匹配的區間pos和endpos兩個參數。

>>> re.match(r"\w+","avde").group()

‘avde‘

pattern. search()方法

pattern. search方法

函數作用:

該方法的作用是在string[pos, endpos]區間從pos下標處開始匹配pattern,如果匹配成功,返回匹配成功的Match對象;如果沒有匹配成功,則將pos加1後重新嘗試匹配,直到pos=endpos時仍無法匹配則返回None。

參數說明:

string:被匹配的字符串

pos:匹配的起始位置,可選,默認為0

endpos:匹配的結束位置,可選,默認為len(string)

也就是說如果不指定pos和endpos這兩個參數的話,該方法會掃描整個字符串。

>>> pattern=re.compile("\d+\w*")

>>> pattern.search("12abc123ABc123",0,10).group()

‘12abc123AB‘

>>> pattern.search("12abc123ABc123",0,9).group()

‘12abc123A‘

re.search方法:

掃描整個字符串並返回第一次成功的匹配對象,如果匹配失敗,則返回None。

參數說明:

pattern:匹配的正則表達式

string:要匹配的字符串

flags:標誌位,用於控制正則表達式的匹配方式。如是否區分大小寫、是否多行匹配等。

>>> re.search(r"[abc]\*\d{2}","12a*23Gb*12ab").group()

‘a*23‘

re.search()方法與pattern.search()方法區別:

re.search()不能指定匹配的區間pos和endpos兩個參數。

re.match與re.search的區別:

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

正則表達式中pattern.match(),re.match(),pattern.search(),re.search()方法的使用和區別