目录
问题
如果我们想要对字符串中的文本做替换,该如何办?
解决方案
针对简单的文本模式,我们直接使用字符串内置方法 str.replace()
函数即可。
text = "I leave a message for you."
print(text.replace('leave', 'left'))
结果:
I left a message for you.
函数 replace(_old, _new)
有两个参数,其中 _old
为需要被替换的内容,_new
为新内容。
较为复杂的模式,使用正则化 re
模块中 sub()
函数方法。
假如我们希望对文本中的日期格式从 dd/mm/yyyy
的格式改写为 yyyy-mm-dd
import re
message = "the date when i left is 05/06/2024."
print(re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', message))
结果:
the date when i left is 2024-06-05.
sub(pattern, repl, str)
有三个参数,第一个 pattern
为要匹配的模式,第二个参数 repl
为要替换上的模式,第三个参数为字符串名。而其中,\3
这样反斜线加上数字的含义则是代表模式中捕获组的编号。即 \3 -> yyyy
,\2 -> mm
,\1 -> dd
。
当然,sub()
函数支持使用相同的模式对多个内容进行重复替换。
import re
message = "yesterday is 05/06/2024, tomorrow is 07/06/2024."
old_pattern = r"(\d+)/(\d+)/(\d+)"
new_pattern = r"\3-\2-\1"
print(re.sub(old_pattern, new_pattern, message))
结果为:
yesterday is 2024-06-05, tomorrow is 2024-06-07.
对于更加复杂的形式,我们可以结合替换回调函数。
假如我们希望从 05/06/2024
的格式替换为 05 Jun 2024
import re
from calendar import month_abbr
def change_date(m):
mon_name = month_abbr[int(m.group(2))]
return '{} {} {}'.format(m.group(1), mon_name, m.group(3))
text = "I met you from the date of 23/10/2023"
old_pattern = re.compile(r"(\d+)/(\d+)/(\d+)")
print(old_pattern.sub(change_date, text))
代码中使用 old_pattern.sub()
方法来查找并替换 text
中所有匹配的日期,其中 change_date
函数作为 回调函数 传给 sub()
方法,对于每一个匹配到的日期,sub()
方法都会调用 change_date
函数,并使用其返回的内容。
而 回调函数 之所以称为回调函数,则是因为其是由另一个函数在适当的时候 “回调”(即:调用回来)。这种方案提供了一种在主流程之外处理特定任务的灵活方式,不必修改函数本身,允许开发者自定义替换逻辑,增强了代码的可扩展性以及可维护性。
另外,sub()
函数的进阶版 subn()
函数还可以返回字符串中内容总共进行了多少次替换的统计结果。
import re
message = "yesterday is 05/06/2024, tomorrow is 07/06/2024."
old_pattern = r"(\d+)/(\d+)/(\d+)"
new_pattern = r"\3-\2-\1"
print(re.subn(old_pattern, new_pattern, message))
结果返回的是包含两个值的元组,
('yesterday is 2024-06-05, tomorrow is 2024-06-07.', 2)
元组中第一个值为替换好的内容,第二个值则是一共进行了多少次替换的统计结果。
讨论
在文本替换方面,以上阐述的三种方式(str.replace()
、re.sub()
、re.subn()
)以及回调函数的结合已然囊括绝大部分的替换需求。
在正则化中,其实最具技巧性或者说还需读者另外补充提升的部分,就是在于指定正则表达式模式上。如何能够将字符串中的内容准确简洁的通过自定义的正则化规则匹配好,是一个世纪难题。
标签:06,sub,pattern,2024,re,Cookbook,函数 From: https://blog.csdn.net/weixin_43098506/article/details/139498221