一、 引言
在《第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 字符轉義序列會被當作錯誤來處理,其他未知轉義序列例如
\&
會保持原樣; - repl如果是字符串,可以使用組名如\g或組序號如 \1、\g<序號>的后向引用,實際處理時會使用組匹配結果的對應組所匹配到的子字符串來執行目標串的替換;
-
如果repl是函數類型:
1)函數只能帶一個參數,參數類型必須是匹配對象;
2)該匹配對象是Python每匹配到一個搜索串時調用,由于搜索內容是由整個正則表達式確認的,因此一般情況下搜索串應該是以代表整個搜索內容的組0對應結果作為處理數據進行處理,除非有特殊處理要求再考慮使用其他組;
3)Python在每匹配到一個該函數對匹配對象處理的結果進行處理后的返回內容作為替換字符串。
四、 案例
- 分別調用sub和subn使用字符串作為替換內容,字符串包含組名和組序號
>>> re.sub(r'(?i)(?P
py\w*)',r'\1:\g<1>:\g
->Python','Python?PYTHON!Learning python with LaoYuan! ')
'Python:Python:Python->Python?PYTHON:PYTHON:PYTHON->Python!Learning python:python:python->Python with LaoYuan! '
>>>re.subn(r'(?i)(?P
py\w*)',r'\1:\g<1>:\g
->Python','Python?PYTHON!Learning python with LaoYuan! ')
('Python:Python:Python->Python?PYTHON:PYTHON:PYTHON->Python!Learning python:python:python->Python with LaoYuan! ', 3)
>>>
上述案例中,
\1:\g<1>:\g
都是訪問的匹配的字符串,除了不論大小寫的“python”,其他諸如“py”、“pyth”等py開頭的字符串都會被替換為“Python”。
-
使用函數作為替換內容
本案例將小說的中文章節中的數字替換為阿拉伯數字,定義了函數transnumber將中文數字翻譯成阿拉伯數字,在正則表達式中找章節并調用函數transnumber執行替換。
>>> def transnumber(m):
numbdict={'零':'0','一':'1','二':'2','三':'3','四':'4','五':'5','六':'6','七':'7','八':'8','九':'9','十':'','百':''}
result=[]
for i in m.group(0):result.append(numbdict[i])
resultstr = ''.join(result)
print("group(0):",m.group(0),"groups:",m.groups(),"result:",resultstr)
return resultstr
>>> re.sub(r'(?<=第)([一-十零百]+)(?=[章,回])',transnumber,'第一回第二回第九十七回第一百零八回第七百二十二回')
group(0): 一 groups: ('一',) result: 1
group(0): 二 groups: ('二',) result: 2
group(0): 九十七 groups: ('九十七',) result: 97
group(0): 一百零八 groups: ('一百零八',) result: 108
group(0): 七百二十二 groups: ('七百二十二',) result: 722
'第1回第2回第97回第108回第722回'
>>> re.subn(r'(?<=第)([一-十零百]+)(?=[章,回])',transnumber,'第一回第二回第九十七回第一百零八回第七百二十二回')
group(0): 一 groups: ('一',) result: 1
group(0): 二 groups: ('二',) result: 2
group(0): 九十七 groups: ('九十七',) result: 97
group(0): 一百零八 groups: ('一百零八',) result: 108
group(0): 七百二十二 groups: ('七百二十二',) result: 722
('第1回第2回第97回第108回第722回', 5)
>>>
老猿Python,跟老猿學Python!
博客地址:https://blog.csdn.net/LaoYuanPython
請大家多多支持,點贊、評論和加關注!謝謝!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
