天天看點

第11.23節 Python 中re子產品的搜尋替換功能:sub及subn函數

一、 引言

在《​​第11.3節 Python正規表達式搜尋支援函數search、match、fullmatch、findall、finditer​​》重點介紹了幾個搜尋函數,除了搜尋,re子產品也提供搜尋并替換功能,這個就是re子產品的sub函數。

二、 文法釋義

調用文法:

re.sub(pattern, repl, string, count=0, flags=0)

re.subn(pattern, repl, string, count=0, flags=0)

參數:

1)pattern:比對的正規表達式;

2)string:搜尋文本字元串

3)repl:替換對象,将搜尋文本中和模式比對的字元串替換為repl對象對應的内容,repl可以是,或者是字元串一個函數

4)count:用于限制最多替換多少次,為0或者沒有傳入則全部替換;

5)flags:搜尋标記,與《第11.2節 Python 正規表達式支援函數概覽》介紹的參數flags标記含義相同。

傳回值:

sub傳回通過使用 repl 替換在通過正規表達式模式搜尋到的字元串。 如果沒有找到比對子串,則直接傳回 string。

subn與sub函數一樣執行搜尋替換,但是不是傳回替換後的字元串,而是傳回一個元組,元組的第一個元素是替換後的字元串(該元素與sub傳回值相同),第二個元素是執行替換的次數。

三、 關于repl參數的說明

可以是字元串,如為字元串,則其中任何反斜杠轉義序列都會被按轉義結果處理, 也就是說,\n 會被轉換為一個換行符,\r 會被轉換為一個回車附,…。 未知的 ASCII 字元轉義序列會被當作錯誤來處理,其他未知轉義序列例如 ​<code>​\&amp;​</code>​會保持原樣;

repl如果是字元串,可以使用組名如\g或組序号如 \1、\g&lt;序号&gt;的後向引用,實際處理時會使用組比對結果的對應組所比對到的子字元串來執行目标串的替換;

如果repl是函數類型:

1)函數隻能帶一個參數,參數類型必須是比對對象;

2)該比對對象是Python每比對到一個搜尋串時調用,由于搜尋内容是由整個正規表達式确認的,是以一般情況下搜尋串應該是以代表整個搜尋内容的組0對應結果作為處理資料進行處理,除非有特殊處理要求再考慮使用其他組;

3)Python在每比對到一個該函數對比對對象處理的結果進行處理後的傳回内容作為替換字元串。

四、 案例

分别調用sub和subn使用字元串作為替換内容,字元串包含組名群組序号

上述案例中,​<code>​\1:\g&lt;1&gt;:\g&lt;lab&gt;​</code>​都是通路的比對的字元串,除了不論大小寫的“python”,其他諸如“py”、“pyth”等py開頭的字元串都會被替換為“Python”。

使用函數作為替換内容

本案例将小說的中文章節中的數字替換為阿拉伯數字,定義了函數transnumber将中文數字翻譯成阿拉伯數字,在正規表達式中找章節并調用函數transnumber執行替換。