Python 學習 第十篇:正則表達式 - re


規則表達式(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)

 

 

 

參考文檔:

re — Regular expression operations

Python正則表達式指南

在python中使用正則表達式(一)

python正則表達式詳解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM