日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

第11.23節 Python 中re模塊的搜索替換功能:sub及subn函數

系統 2082 0

一、 引言
在《第11.3節 Python正則表達式搜索支持函數search、match、fullmatch、findall、finditer》重點介紹了幾個搜索函數,除了搜索,re模塊也提供搜索并替換功能,這個就是re模塊的sub函數。

二、 語法釋義

  1. 調用語法:
    re.sub(pattern, repl, string, count=0, flags=0)
    re.subn(pattern, repl, string, count=0, flags=0)

  2. 參數:
    1)pattern:匹配的正則表達式;
    2)string:搜索文本字符串
    3)repl:替換對象,將搜索文本中和模式匹配的字符串替換為repl對象對應的內容,repl可以是,或者是字符串一個函數
    4)count:用于限制最多替換多少次,為0或者沒有傳入則全部替換;
    5)flags:搜索標記,與《第11.2節 Python 正則表達式支持函數概覽》介紹的參數flags標記含義相同。

  3. 返回值:
    sub返回通過使用 repl 替換在通過正則表達式模式搜索到的字符串。 如果沒有找到匹配子串,則直接返回 string。
    subn與sub函數一樣執行搜索替換,但是不是返回替換后的字符串,而是返回一個元組,元組的第一個元素是替換后的字符串(該元素與sub返回值相同),第二個元素是執行替換的次數。

三、 關于repl參數的說明

  1. 可以是字符串,如為字符串,則其中任何反斜杠轉義序列都會被按轉義結果處理, 也就是說,\n 會被轉換為一個換行符,\r 會被轉換為一個回車附,…。 未知的 ASCII 字符轉義序列會被當作錯誤來處理,其他未知轉義序列例如 \& 會保持原樣;
  2. repl如果是字符串,可以使用組名如\g或組序號如 \1、\g<序號>的后向引用,實際處理時會使用組匹配結果的對應組所匹配到的子字符串來執行目標串的替換;
  3. 如果repl是函數類型:
    1)函數只能帶一個參數,參數類型必須是匹配對象;
    2)該匹配對象是Python每匹配到一個搜索串時調用,由于搜索內容是由整個正則表達式確認的,因此一般情況下搜索串應該是以代表整個搜索內容的組0對應結果作為處理數據進行處理,除非有特殊處理要求再考慮使用其他組;
    3)Python在每匹配到一個該函數對匹配對象處理的結果進行處理后的返回內容作為替換字符串。

四、 案例

  1. 分別調用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”。

  1. 使用函數作為替換內容
    本案例將小說的中文章節中的數字替換為阿拉伯數字,定義了函數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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 广平县| 松桃| 黄浦区| 永嘉县| 鄄城县| 含山县| 张家港市| 海丰县| 华容县| 中牟县| 吉林市| 定襄县| 千阳县| 邛崃市| 惠安县| 舒兰市| 阳山县| 牟定县| 万安县| 井陉县| 沂南县| 元朗区| 西林县| 申扎县| 明光市| 望城县| 丰宁| 乐清市| 南通市| 宜章县| 普宁市| 宁陵县| 崇阳县| 石渠县| 瓮安县| 边坝县| 黑龙江省| 德化县| 张掖市| 苍溪县| 古交市|