2.5字符串搜索替换

问题

​ 你想在字符串中搜索和匹配指定的文件模式

解决方案

​ 对于简单的字面模式,直接使用str.replace()方法即可,比如:

text = 'yeah,but no, but yeah, but no ,but yeah'
print(text.replace('yeah','yep'))   # ->yep,but no, but yep, but no ,but yep

​ 对于复杂的模式,请使用re模块中的sub()函数。为了说明这个,假设你想将形式为02/18/2012的日志字符串改成2022-02-18.示例如下:

text = 'Tody is 02/18/2022. PyCon starts 09/19/2018'
import  re
print(re.sub(r'(\d+)/(\d+)/(\d+)',r'\3-\1-\2',text))
# ->Tody is 2022-02-18. PyCon starts 2018-09-19

​ sub()函数中的第一个参数是被匹配的模式,第二个参数是替换模式。反斜杠数字比如\3指向前面模式的捕获组号。

​ 如果你打算用相同的模式做多次替换,考虑先编译它来提升性能:

import re
datepat=re.compile(r'(\d+)/(\d+)/(\d+)')
print(datepat.sub(r'\3-\1-\2',text))  #->Tody is 2022-02-18. PyCon starts 2018-09-19

对于更加复杂的替换,可以传递一个替换回调函数来替代,比如:

from calendar import month_abbr


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


print(datepat.sub(change_date, text))  # ->Tody is 18 Feb 2022. PyCon starts 19 Sep 2018

​ 一个替换回调函数的参数是一个match对象,也就是match()或者find()返回的对象。使用groups()方法来提取特定的匹配部分。回调函数最后返回替换字符串。

​ 如果除了替换后的结果外,你还想知道有多少替换发生了,可以使用re.subn()来代替。比如:

newtext, n = datepat.subn(r'\3-\1-\2', text)
print(newtext)  # ->Tody is 2022-02-18. PyCon starts 2018-09-19
print(n)  # ->  2

讨论

​ 关于正则表达式搜索和替换,上面演示的sub()方法基本已经涵盖了所有,其实最难的部分就是编写正则表达模式。

posted @ 2022-02-18 16:41  qiupeng  阅读(53)  评论(0)    收藏  举报