將匹配的子字符串替換或者從某個字符串中取出符合某個條件的子字符串,或者是在指定的文章中抓取特定的字符串等。python
Python處理正則表達式的模塊是re模塊,它是Python語言中擁有所有的正則表達式功能的模塊。正則表達式
正則表達式由一些普通字符和一些元字符組成。普通字符包括大小寫的字母、數字和打印符號,而元字符是具備特殊含義的字符。express
正則表達式大體的匹配過程是:函數
拿正則表達式依次和字符串或者文本中的字符串作比較,若是每個字符都匹配,則匹配成功,只要有一個匹配不成功的字符,則匹配不成功。spa
正則表達式模式
正則表達式是一種用來匹配字符串得強有力的武器。設計
它的設計思想是用一種描述性的語言來給字符串定義一個規則,凡是符合規則的字符串,咱們就認爲它「匹配」了,不然,就是匹配不成功。 3d
模式字符串使用特殊的語法來表示一個正則表達式:
字母和數字匹配它們自身;
多數字母和數字前加一個反斜槓(\)時會有特殊的含義;
特殊的標點符號,只有被轉義之後才能匹配自身;
反斜槓自己須要反斜槓來轉義;對象
注意:
因爲正則表達式一般包含反斜槓等特殊字符,因此咱們最好使用原始字符串來表示他們。如:r’\d’,等價於’\\d’,表示匹配一個數字。
Python正則表達式中,數量詞默認都是貪婪的,它們會盡力盡量多的去匹配知足的字符,可是若是咱們在後面加上問號「?」,就能夠屏蔽貪婪模式,表示匹配儘量少的字符。blog
如字符串:「xyyyyzs」,使用正則「xy*」,就會獲得「xyyyy」;若是使用正則「xy*?」,將只會匹配「x」
下表列出了正則表達式模式語法中的特殊元素。若是你是使用模式的同時提供了可選的標誌參數,某些模式元素含義就會改變。ip
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(pattern, flags=0) 這個方法是pattern類的工廠方法,目的是將正則表達式pattern編譯成pattern對象,並返回該對象。
它能夠把正則表達式編譯成一個正則表達式對象。
咱們能夠把那些常用的正則表達式編譯成正則表達式對象,這樣能夠提升必定的效率。
第二個參數flag是匹配模式,取值可使用按位或運算符「|」表示同時生效,好比re.I | re.M(忽略大小寫,換行匹配)。
固然你也能夠在regex字符串中指定模式,好比:
re.compile('pattern', re.I | re.M)
它等價於: re.compile('(?im)pattern'),例如:
>>> p=re.compile("\w+",re.I|re.M)
>>> p.match("sadf234").group()
'sadf234'
>>> p=re.compile("(?im)\w+")
>>> p.match("sadf234").group()
'sadf234'
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對象是一個編譯好的正則表達式,也就是經過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']
這個方法將在字符串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'
該函數的做用是嘗試從字符串string的起始位置開始匹配一個模式pattern,若是匹配成功返回一個匹配成功後的Match對象,不然返回None。
參數說明:
pattern:匹配的正則表達式
string:要匹配的字符串
flags:標誌位,用於控制正則表達式的匹配方式。如是否區分大小寫、是否多行匹配等。
例子:
>>> re.match(r"\w+","avde").group()
'avde'
re.match()不能指定匹配的區間pos和endpos兩個參數,pattern.match能夠。
函數做用:
該方法的做用是在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'
掃描整個字符串並返回第一次成功的匹配對象,若是匹配失敗,則返回None。
參數說明:
pattern:匹配的正則表達式
string:要匹配的字符串
flags:標誌位,用於控制正則表達式的匹配方式。如是否區分大小寫、是否多行匹配等。
>>> re.search(r"[abc]\*\d{2}","12a*23Gb*12ab").group()
'a*23'
re.search()不能指定匹配的區間pos和endpos兩個參數。
re.match只匹配字符串的開始,若是字符串開始不符合正則表達式,則匹配失敗,並返貨None;
而re.search匹配整個字符串,直到找到一個匹配。