Python进阶编程:编写更高效、优雅的Python代码
上QQ阅读APP看书,第一时间看更新

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()方法基本已经涵盖了所有。对于正则表达式的使用,最难的部分是编写正则表达式模式,这需要读者自己多加练习。