官术网_书友最值得收藏!

2.4.1 字符串搜索替換

在實際工作中,我們經常需要在字符串中搜索和匹配指定的文本模式。

對于簡單的字符串,直接使用str.replace()函數即可,示例如下:


text_val = 'life is short, I use python, what about you'
print(text_val.replace('use', 'choice'))

對于復雜的模式,我們需要用re模塊中的sub()函數。如將形式為11/27/2012的日期字符串改成2012-11-27,代碼(replace_search.py)示例如下:


text_date = 'Today is 04/21/2020. Python2 stop maintain from 01/01/2020.'
import re
print(re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text_date))

執行py文件,輸出結果如下:


Today is 2020-04-21. Python2 stop maintain from 2020-01-01.

sub()函數中的第一個參數是被匹配的模式,第二個參數是替換模式。反斜杠數字比如\3指向前面模式的捕獲組號。

如果相同的模式要做多次替換,應先編譯以提升性能,示例如下:


date_pat = re.compile(r'(\d+)/(\d+)/(\d+)')
print(date_pat.sub(r'\3-\1-\2', text_date))

對于更復雜的替換,可以傳遞一個替換回調函數執行替換操作,示例如下:


from calendar import month_abbr
def change_date(group_val):
    mon_name = month_abbr[int(group_val.group(1))]
    return f'{group_val.group(2)} {mon_name} {group_val.group(3)}'

print(date_pat.sub(change_date, text_date))

一個替換回調函數的參數是一個match對象,也就是match()或者find()方法返回的對象。group()方法用來提取特定的匹配部分。替換回調函數最后返回替換字符串。

如果我們除了想知道替換后的結果外,還想知道發生了多少替換,可以使用re.subn()方法來代替回調函數,代碼(replace_search.py)示例如下:


new_text, rep_num = date_pat.subn(r'\2-\1-\2', text_date)
print(f'after replace text:{new_text}')
print(f'replace value num:{rep_num}')

執行py文件,輸出結果如下:


after replace text:Today is 21-04-21. Python2 stop maintain from 01-01-01.
replace value num:2

關于正則表達式的搜索和替換,示例中的sub()方法基本已經涵蓋了所有。對于正則表達式的使用,最難的部分是編寫正則表達式模式,這需要讀者自己多加練習。

主站蜘蛛池模板: 商都县| 武宁县| 崇仁县| 十堰市| 云南省| 北宁市| 新泰市| 绥芬河市| 京山县| 广宁县| 罗甸县| 武平县| 响水县| 屏东县| 延长县| 松潘县| 安阳县| 体育| 乐业县| 壶关县| 宣威市| 鲜城| 安西县| 南宁市| 新绛县| 剑川县| 句容市| 扎囊县| 西华县| 武威市| 东阳市| 额敏县| 锦州市| 柳河县| 庆云县| 泸西县| 溧水县| 长岛县| 五寨县| 库尔勒市| 金湖县|