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