同樣的概念也適用於正規表示式— 在模式匹配發生之前,正規表示式模式必須編譯 成正規表示式物件。由於正規表示式在執行過程中將進行多次比較操作,因此強烈建議使 用預編譯。而且,既然正規表示式的編譯是必需的,那麼使用預編譯來提公升執行效能無疑 是明智之舉。re.compile()能夠提供此功能。
一、使用 compile()函式編譯正規表示式
compile(pattern, flags=0)
compile a regular expression pattern, returning a pattern object.
從compile()函式的定義中,可以看出返回的是乙個匹配物件,它單獨使用就沒有任何意義,需要和findall(), search(), match()搭配使用。
def main():
content = 'hello, i am jerry, from chongqing, a montain city, nice to meet you……'
regex = re.compile('\w*o\w*')
x = regex.findall(content)
y = regex.match(content)
z = regex.search(content)
二、匹配物件以及 group()和 groups()方法
group()要麼返回整個匹配物件,要麼根據要求返回特定子組。groups()則僅返回乙個包含 唯一或者全部子組的元組。
三、使用 match()方法匹配字串
match()是將要介紹的第乙個 re 模組函式和正規表示式物件(regex object)方法。match()函式試圖從字串的起始部分對模式進行匹配。如果匹配成功,就返回乙個匹配物件;如果 匹配失敗,就返回 none,匹配物件的 group()方法能夠用於顯示那個成功的匹配。
>>> m = re.match('foo', 'foo') # 模式匹配字串
>>> if m is not none: # 如果匹配成功,就輸出匹配內容
... m.group()
...'foo'
四、使用 search()在乙個字串中查詢模式(搜尋與匹配的對比)
search()的工作方式與 match()完全一致,不 同之處在於 search()會用它的字串引數,在任意位置對給定正規表示式模式搜尋第一次出現 的匹配情況。如果搜尋到成功的匹配,就會返回乙個匹配物件;否則,返回 none。
>>> m = re.search('foo', 'seafood') # 使用 search() 代替
>>> if m is not none: m.group()
...'foo'
五、重複、特殊字元以及分組
正規表示式中最常見的情況包括特殊字元的使用、正規表示式模式的重複出現,以及使用 圓括號對匹配模式的各部分進行分組和提取操作。曾看到過乙個關於簡單電子郵件位址的 正規表示式(\w+@\w+\.com)。
為了表示主機名是可選的,需要建立乙個模式來匹配主機名(後面跟 著乙個句點),使用「?」操作符來表示該模式出現零次或者一次,然後按照如下所示的方式, 插入可選的正規表示式到之前的正規表示式中:\w+@(\w+\.)?\w+\.com。
使用圓括號來匹配和儲存子組,以便於後續處理,而不是確定乙個正則表達 式匹配之後,在乙個單獨的子程式裡面手動編碼來解析字串。
>>> m = re.match('(\w\w\w)-(\d\d\d)', 'abc-123')
>>> m.group() #完整匹配
'abc-123'
>>> m.group(1) #子組1
'abc'
>>> m.group(2) #子組2
'123'
>>> m.groups() #全部子組
('abc', '123')
六、使用 findall()和 finditer()查詢每一次出現的位置
findall()查詢字串中某個正規表示式模式全部的非重複出現情況。findall()總是返回乙個列表,如果 findall()沒有找到匹配的部分,就返回乙個空列表,但如果匹配成功,列表將包含所有成 功的匹配部分(從左向右按出現順序排列)。
子組在乙個更複雜的返回列表中搜尋結果,而且這樣做是有意義的,因為子組是允許從單個正規表示式中抽取特定模式的一種機制。對於乙個成功的匹配,每個子組匹配是由 findall()返回的結果列表中的單一元素;對於多個成功的匹配,每個子組匹配是返回的乙個元組中的單一元素,而且每個元組(每個元組下·都對應乙個成功的匹配)是結果列表中的元素。
七、使用 sub()和 subn()搜尋與替換
有兩個函式/方法用於實現搜尋和替換功能: sub()和 subn()。subn()和 sub()一樣,但 subn()還返回乙個表示替換的總數,替換後的字串和表示替換總數的數字一起作為乙個擁有兩個元素的元組返回。
格式為re.sub(pattern, repl, string, count=0, flags=0)
例子如下
>>> re.sub('x', 'mr. smith', 'attn: x\n\ndear x,\n')
'attn: mr. smith\012\012dear mr. smith,\012'
八、在限定模式上使用 split()分隔字串
如果給定分隔符不是使用特殊符號來匹配多重模式的正規表示式,那麼 re.split()與str.split()的工作方式相同
>>> re.split(':', 'str1:str2:str3')
['str1', 'str2', 'str3']
另外乙個例子
>>> import re
>>> data = (
... 'mountain view, ca 94040',
... 'sunnyvale, ca',
... 'los altos, 94023',
... 'cupertino 95014',
... 'palo alto ca',
... )
>>> for datum in data:
... print re.split(', |(?= (?:\d|[a-z])) ', datum)
...['mountain view', 'ca', '94040']
['sunnyvale', 'ca']
['los altos', '94023']
['cupertino', '95014']
['palo alto', 'ca']
python 正規表示式應用
usr bin env python coding utf 8 乙個小爬蟲 其中用的規則是 src jpg pic ext 可是這樣會出現問題 如 網頁源 中會有這樣的串 情況一 引用非jpg的標籤後連著乙個引用jpg的標籤 匹配出來的url pic ext png width 30 height ...
正規表示式應用
d 非負整數 正整數 0 0 9 1 9 0 9 正整數 d 0 非正整數 負整數 0 0 9 1 9 0 9 負整數 d 整數 d 非負浮點數 正浮點數 0 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 正浮點數 d 非正浮點數 負浮點數 0 0 9 0 ...
正規表示式(應用)
在此頁面寫正規表示式,可以提供參考,和進行校驗 應用於前端 匹配任意長度的大小寫字母與數字 a za z0 9 匹配任意長度且不為空的大小寫字母與數字 a za z0 9 匹配長度小於20且不為空的大小寫字母與數字 a za z0 9 匹配長度小於20且不為空的大小寫字母與數字與漢字 a za z0...