python使用正則表達式剔除指定開頭和結尾之間的所有字符串內容

       這裏的一個基本的需求就是對於一個字符串,想要剔除指定開頭和結尾及其之間所有的內容,一個經典的場景就是剔除一個腳本里面所有的以/**開頭和**/結尾的註釋。對此,需要注意的點有三個:1、如何跨行匹配/**和**/之間的所有內容,因爲.無法匹配換行符;2、要注意使用非貪心匹配,以防把代碼也剔除;3、如何高效剔除匹配到的內容。

       具體的正則表達式如下。這個正則表達式中要注意對*的轉義,以及使用非捕獲組(?:...)的使用,這裏使用.匹配其他字符,利用\s匹配換行符等空白字符,當然也可以使用\n,還要注意非捕獲組後面使用的是非貪心匹配,這是因爲如果使用貪心匹配,那麼多個註釋之間的代碼也會被匹配上,從而把正常的代碼也剔除。

import re

pattern = re.compile(r'/\*\*(?:.|\s)*?\*\*/')

       之後如何高效剔除匹配到的內容呢?本文的方法如下。本文使用的是re.split函數,因爲其會直接使用匹配到的內容作爲分隔符,並且返回的列表是不包含分隔符的內容,所以直接對返回的列表進行拼接就可以得到剔除後的內容updated,這樣的代碼比較簡潔易懂。

import re

pattern = re.compile(r'/\*\*(?:.|\s)*?\*\*/')

f = open('to_be_processed.cpp')
s = f.read()
updated = ''.join(re.split(pattern,s))
f.close()

       最後,對於不是以/**開頭和**/結尾的標誌,我們可通過如下方式實現指定。下面的函數process實現了該功能,其中start和end作爲參數傳入,並且經過re.escape處理後再加入字符串。這裏re.escape函數的作用是得到可以真正匹配傳入字符串的正則表達式,因爲存在正則轉義,所以可能出現非預期的結果,而通過re.escape處理後就可以保證我們的正確匹配。

import re

def process(start,end,f):

    start = re.escape(start)
    end = re.escape(end)
    pattern = re.compile(r'%s(?:.|\s)*?%s'%(start,end))

    s = f.read()
    updated = ''.join(re.split(pattern,s))

    return updated

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章