規則表達式(Regular Expression, RE),又稱作正則表達式,通常用於檢索和替換符合指定規則的文本,正則表達式定義的規則,稱作模式(Pattern)。正則表達式的作用是從文本中查找到符合模式的文本,在Python中使用正則表達式,需要導入re模塊。
import re
查看正則表達式的元字符,請參考文檔:正則表達式 第一篇:元字符
一,re模塊常用的函數
從幫助文檔中可以看到,re模塊導出的函數主要是:match、search、sub、split、findall、finditer、compile和escape,這些函數中,通常有三個參數,string:用於匹配的文本,pattern:正則表達式的模式,flags:匹配選項,flags 默認為0 ,不使用任何模式。
正則表達式的flag主要有:
- I:IGNORECASE, 忽略大小寫的匹配模式
- M:MULTILINE,多行模式, 改變 ^ 和 $ 的行為
- S:DOTALL,此模式下 '.' 的匹配不受限制,可匹配任何字符,包括換行符
- X:VERBOSE,冗余模式, 此模式忽略正則表達式中的空白和#號的注釋,例如寫一個匹配郵箱的正則表達式
- U:UNICODE,使用 \w, \W, \b, \B 這些元字符時將按照 UNICODE 定義的屬性.
正則表達式可以同時使用多個flag,在 Python 里面使用按位或運算符 | 同時添加多個fag,例如 re.compile('', re.I|re.M|re.S)
1,編譯正則表達式
compile函數用於編譯一個正則表達式對象,在符用正則表達式時,步需要重新編譯:
re.compile(pattern, flags=0)
2,原始字符標記
原始字符串表示 r'regex',如果不使用r,正則表達式中的 元字符'\' 都必須進行轉義:
>>> re.match(r"\W(.)\1\W", " ff ") >>> re.match("\\W(.)\\1\\W", " ff ")
這就意味着,在正則表達式中,如果 \x 是元字符,那么必需使用r'\x'。
如果要匹配到文本 '\' (也就是說,\ 不是元字符),那么必須在正則表達式中對其進行轉義,使用原始字符標記,是r'\\';如果不使用原始字符標記,是'\\\\':
>>> re.match(r"\\", r"\\") >>> re.match("\\\\", r"\\")
3,拆分
把一個字符串,按照正則表達式匹配的結果進行拆分
text='foo bar\t baz \tqux' re.split(r'\s+',text)
或者,先編譯成正則表達式對象,然后對字符串進行拆分:
regex=re.compile(r'\s+') text='foo bar\t baz \tqux' regex.split(text)
4,匹配第一個子串
正則表達式有兩個匹配函數:match和search函數,這兩個函數的相同之處:從字符串中查找可以匹配的子串,返回第一個匹配的子串,一旦匹配成功,就不再繼續查找,並返回一個SRE_Match 對象;如果查找不到,則返回None。
re.match(pattern, string, flags=0)
re.search(pattern, string, flags=0)
不同之處在於:
- re.match函數從字符串的開頭查找,如果開頭不匹配,則不再繼續查找,返回None;
- 而re.search匹配整個字符串,從字符串的任意位置開始匹配,直到找到第一個匹配(注意:僅僅是第一個)或者沒有匹配到任何文本。
5,查找所有匹配的子串
re.findall在字符串中找到匹配正則表達式的所有文本,作為一個列表返回,如果沒有找到匹配,則返回空列表:
re.findall(pattern, string, flags=0)
re.finditer在字符串中找到匹配正則表達式所的所有文本,並把它們作為一個迭代器返回:
re.finditer(pattern, string, flags=0)
6,替換匹配的字符
把正則表達式 pattern 匹配到的字符串替換為 repl 指定的字符串, 參數 count 用於指定最大替換次數,默認值是o,表示無限大。
re.sub(pattern, repl, string, count=0, flags=0)
替換函數可以把文本的標點符號和HTML標簽去掉。在替換字符時,需要注意:如果repl參數中包含轉義字符,會出現錯誤,例如,對於 re.sub('pattern',r'\w+',text), re會拋出錯誤:bad escape \w at position 0。
從re的手冊《re — Regular expression operations》中,可以看到,在3.0以上版本,都會出現這個錯誤:
Changed in version 3.x : Unknown escapes in repl consisting of '\' and an ASCII letter now are errors.
二,re內置的對象
re模塊內置的對象有Pattern對象和Match對象,一個用於表示已編譯的正則表達式對象,一個表示search()和match()匹配的結果。
1,Pattern對象
Pattern對象是一個已編譯的正則表達式對象,使用re.compile()進行構造,通過Pattern提供的一系列方法可以對文本進行匹配查找。
Pattern對象的方法,用於進行正則匹配:
- search(string[, pos[, endpos]])
- match(string[, pos[, endpos]])
- split(string, maxsplit=0)
- findall(string[, pos[, endpos]])
- finditer(string[, pos[, endpos]])
- sub(repl, string, count=0)
Pattern提供了幾個可讀屬性用於獲取表達式的相關信息:
- pattern: 編譯時用的表達式字符串。
- flags: 編譯時用的匹配模式,數字形式
- groups: 表達式中分組的數量。
- groupindex: 以表達式中有別名的組的別名為鍵、以該組對應的編號為值的字典,沒有別名的組不包含在內。
2,Match對象
Match對象存儲 re.match() 或 re.search()的結果,當匹配到文本時,含有為True的boolean值;當沒有匹配到任何文本時,返回None。
def displaymatch(match): if match is None: return None return '<Match: %r, groups=%r>' % (match.group(), match.groups())
Match對象的屬性:
- string:傳遞給re.match() 或 re.search()的文本
- regs:元組集合,表示每個匹配的起始索引和結束索引
- pos:正則表達式開始匹配的索引
- endpos:正則表達式結束匹配的索引
- re:正則表達式對象
Match對象的方法:
- start(group):group的默認值是0,表示每個匹配的文本的開始索引
- end(group):group的默認值是0,表示每個匹配的文本的結束索引
- group(group=0):參數為0時,表示返回整個匹配
- groups():返回匹配到的所有分組的索引
- span(group=0):返回匹配的開始索引和結束索引
三,正則表達式的應用
1,刪除文本中的標點符號
remove_punct=re.compile('[%s]' % re.escape(string.punctuation)) no_punct = remove_punct.sub(u'', text)
2,刪除文本中的HTML標簽
# use sub to replace the tags pat = re.compile('<[^>]+>', re.S) pat.sub('', text) #combine the normal text pat = re.compile('>(.*?)<') ''.join(pat.findall(text))
3,查找匹配的文本
import re text_data = 'guru99@google.com, careerguru99@hotmail.com, users@yahoomail.com' emails_list = re.findall(r'[\w\.-]+@[\w\.-]+', text_data)
參考文檔: