一、 引言
在《第11.3節(jié) Python正則表達(dá)式搜索支持函數(shù)search、match、fullmatch、findall、finditer》重點(diǎn)介紹了幾個(gè)搜索函數(shù),除了搜索,re模塊也提供搜索并替換功能,這個(gè)就是re模塊的sub函數(shù)。
二、 語法釋義
-
調(diào)用語法:
re.sub(pattern, repl, string, count=0, flags=0)
re.subn(pattern, repl, string, count=0, flags=0) -
參數(shù):
1)pattern:匹配的正則表達(dá)式;
2)string:搜索文本字符串
3)repl:替換對(duì)象,將搜索文本中和模式匹配的字符串替換為repl對(duì)象對(duì)應(yīng)的內(nèi)容,repl可以是,或者是字符串一個(gè)函數(shù)
4)count:用于限制最多替換多少次,為0或者沒有傳入則全部替換;
5)flags:搜索標(biāo)記,與《第11.2節(jié) Python 正則表達(dá)式支持函數(shù)概覽》介紹的參數(shù)flags標(biāo)記含義相同。 -
返回值:
sub返回通過使用 repl 替換在通過正則表達(dá)式模式搜索到的字符串。 如果沒有找到匹配子串,則直接返回 string。
subn與sub函數(shù)一樣執(zhí)行搜索替換,但是不是返回替換后的字符串,而是返回一個(gè)元組,元組的第一個(gè)元素是替換后的字符串(該元素與sub返回值相同),第二個(gè)元素是執(zhí)行替換的次數(shù)。
三、 關(guān)于repl參數(shù)的說明
-
可以是字符串,如為字符串,則其中任何反斜杠轉(zhuǎn)義序列都會(huì)被按轉(zhuǎn)義結(jié)果處理, 也就是說,\n 會(huì)被轉(zhuǎn)換為一個(gè)換行符,\r 會(huì)被轉(zhuǎn)換為一個(gè)回車附,…。 未知的 ASCII 字符轉(zhuǎn)義序列會(huì)被當(dāng)作錯(cuò)誤來處理,其他未知轉(zhuǎn)義序列例如
\&
會(huì)保持原樣; - repl如果是字符串,可以使用組名如\g或組序號(hào)如 \1、\g<序號(hào)>的后向引用,實(shí)際處理時(shí)會(huì)使用組匹配結(jié)果的對(duì)應(yīng)組所匹配到的子字符串來執(zhí)行目標(biāo)串的替換;
-
如果repl是函數(shù)類型:
1)函數(shù)只能帶一個(gè)參數(shù),參數(shù)類型必須是匹配對(duì)象;
2)該匹配對(duì)象是Python每匹配到一個(gè)搜索串時(shí)調(diào)用,由于搜索內(nèi)容是由整個(gè)正則表達(dá)式確認(rèn)的,因此一般情況下搜索串應(yīng)該是以代表整個(gè)搜索內(nèi)容的組0對(duì)應(yīng)結(jié)果作為處理數(shù)據(jù)進(jìn)行處理,除非有特殊處理要求再考慮使用其他組;
3)Python在每匹配到一個(gè)該函數(shù)對(duì)匹配對(duì)象處理的結(jié)果進(jìn)行處理后的返回內(nèi)容作為替換字符串。
四、 案例
- 分別調(diào)用sub和subn使用字符串作為替換內(nèi)容,字符串包含組名和組序號(hào)
>>> 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開頭的字符串都會(huì)被替換為“Python”。
-
使用函數(shù)作為替換內(nèi)容
本案例將小說的中文章節(jié)中的數(shù)字替換為阿拉伯?dāng)?shù)字,定義了函數(shù)transnumber將中文數(shù)字翻譯成阿拉伯?dāng)?shù)字,在正則表達(dá)式中找章節(jié)并調(diào)用函數(shù)transnumber執(zhí)行替換。
>>> 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,跟老猿學(xué)Python!
博客地址:https://blog.csdn.net/LaoYuanPython
請(qǐng)大家多多支持,點(diǎn)贊、評(píng)論和加關(guān)注!謝謝!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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