首页 > 编程语言 >【Python Cookbook】S01E22 替换文本 re.sub(),re.subn() 以及 回调函数

【Python Cookbook】S01E22 替换文本 re.sub(),re.subn() 以及 回调函数

时间:2024-06-06 18:02:24浏览次数:28  
标签:06 sub pattern 2024 re Cookbook 函数

目录

问题

如果我们想要对字符串中的文本做替换,该如何办?

解决方案

针对简单的文本模式,我们直接使用字符串内置方法 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

相关文章

  • Revit二次开发-使用Advanced Installer打包插件安装包
    插件开发属于客户端开发,当我们交付产品给客户的时候,肯定用安装包的形式交付是最佳方案。所以我摸索了一下怎么用AdvancedInstaller来打包插件安装包。AdvancedInstaller简介AdvancedInstaller是一款功能强大且用户友好的Windows安装包制作工具,专门用于创建安装包(MSI、EX......
  • Entity Framwork Core (一)
    ORM:ObjectRelationalMapping。让开发者用对象操作的形式操作关系数据库。从面向数据库集中到面向对象。NugetMicrosoft.EntityFrameworkCore//针对于sqlserverMicrosoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.Design//在vs中需要装Microsoft.......
  • Jail管理器AppJail的使用@FreeBSD
    Jail的简介Jail是FreeBSD操作系统中一个功能强大的安全机制,自FreeBSD4.X版本起便投入使用,并且随着系统的发展,其功能、效率、稳定性和安全性得到了持续的强化。Jail基于chroot的概念,通过更改一系列程序的根目录,为程序提供了一个隔离的安全环境,将其与系统的其他部分完全分隔......
  • WPF grid column resize via GridSpitter, when you can drag to enlarge or shrink t
    <Windowx:Class="WpfApp137.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft......
  • three.js高性能渲染室外场景
    大家好,本文在相关文章的基础上,使用three.js渲染了高性能的室外场景,在移动端也有较好的性能,并给出了代码,分析了关键点,感谢大家~关键词:three.js、Web3D、WebGL、室外场景、InstancedDraw、大场景、LOD、FrustumCull、优化、开源代码:Github相关文章:three.js实现数字孪生3D仓库......
  • 每天学一个 Linux 命令(5):grep
    命令简介文本查找或搜索工具。用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为-,则grep会从标准输入设备读取数据。同样可以配合正则表达式来搜索文本,并将......
  • Android网络请求:协程+Flow+Retrofit+OkHttp
    在Android开发中,网络请求是一个很常见的任务。随着Kotlin协程和Flow的流行,我们有了新的工具来优雅地处理网络请求。结合Retrofit和OkHttp,我们可以构建一个强大的、易于理解和维护的网络请求框架。一、Kotlin协程与FlowKotlin协程是Kotlin提供的一种轻量级线程管理方式。它......
  • 深入学习 CSS 中的伪元素 ::before 和 ::after
    CSS伪元素用于为元素的指定部分设置样式,作为回顾,先来看下 Mozilla 开发者网站上的解释:伪元素是一个附加至选择器末的关键词,允许你对被选择元素的特定部分修改样式。例如 ::first-line 伪元素可用于更改段落首行文字的样式。可用的CSS伪元素不是很多,但是,作为前端工程师......
  • SpringBoot启动流程分析之准备应用上下文refreshContext()(八)
    SpringBoot启动流程分析之准备应用上下文refreshContext()(八)文章目录SpringBoot启动流程分析之准备应用上下文refreshContext()(八)1、准备刷新1.1、子类prepareRefresh()方法1.2父类prepareRefresh()方法2、通知子类刷新内部bean工厂3、准备bean工厂4、允许上下文子类对b......
  • 2种方法解决需要clik点击数的题目——[HNCTF 2022 WEEK2]getflag 137分 MFC patch RE
    题目   DIEIDA找到判断点击数的if,我们修改一下汇编指令让点击数<99999999就成立这个程序没有要求我们输入,说明flag是程序打印的IDA动调 下一个断点修改 得到flag  还有一种更快的方法——CheatEngine 随便点击几次 在CE中修改点击次数 Getf......