在 Python 中的常见的几种字符串替换操作

在 Python 中的常见的几种字符串替换操作基于Python3.7.3中,主要的方法有替换子串:replace()替换多个不同的字符串:re.sub(),re.subn()用正则表达式替换:re.sub(),re.subn()根据位置来替换:slice()replace()方法比如,输入的字符串为’onetwoonetwoone’,第一个参数为替换前的参数,第二个为替换后的参数。默认会替换字符串中的所有符合条件的字…

大家好,又见面了,我是你们的朋友全栈君。

基于Python3.7.3中,主要的方法有

  • 替换子串:replace()
  • 替换多个不同的字符串:re.sub(),re.subn()
  • 用正则表达式替换:re.sub(),re.subn()
  • 根据位置来替换:slice()

replace() 方法

比如,输入的字符串为’one two one two one’,第一个参数为替换前的参数,第二个为替换后的参数。默认会替换字符串中的所有符合条件的字符串

s = 'one two one two one'

print(s.replace(' ', '-'))
# one-two-one-two-one

也可以指定一个最大替换次数值,一旦指定,只会替换前面匹配的n个字符串

print(s.replace('one', 'XXX'))
# XXX two XXX two XXX

print(s.replace('one', 'XXX', 2))
# XXX two XXX two one

当然,也可以支持链式的多次调用实现多重条件过滤。(但最好还是使用下面的translate()方法)

print(s.replace('one', 'XtwoX').replace('two', 'YYY'))
# XYYYX YYY XYYYX YYY XYYYX

print(s.replace('two', 'YYY').replace('one', 'XtwoX'))
# XtwoX YYY XtwoX YYY XtwoX

替换多个不同的字符串: translate()

translate官方文档

转换关系存放在 str.maketrans() 方法来创建。并且调用 translate() 来真正的执行。用例如下

s = 'one two one two one'

print(s.translate(str.maketrans({ 
   'o': 'O', 't': 'T'})))
# One TwO One TwO One

print(s.translate(str.maketrans({ 
   'o': 'XXX', 't': None})))
# XXXne wXXX XXXne wXXX XXXne

其中,maketrans 方法中是一个字典参数,第一个参数(key)为替换前的参数,第二个参数(value)为替换后的参数(为None表示移除替换前的参数)。

str.maketrans()也可以使用三个字符串作为参数,而不是字典。

如果不是一个字典参数,而是如下的两个参数或者3个参数,那么结果如下:

print(s.translate(str.maketrans('ow', 'XY')))
# Xne tYX Xne tYX Xne

print(s.translate(str.maketrans('ow', 'XY', 'n')))
# Xe tYX Xe tYX Xe

在上面的情况下,第一个和第二个参数的长度必须匹配。在两个参数的情况下,会将第一个参数的字符,依次的映射成第二个参数的字符(o-> X,w-> Y)。第三个参数表示在映射完的结果之后,需要移除的字符。

通过正则表达式来实现替换:re.sub, re.subn

re — Regular expression operations

在第一个参数中输入正则表达式,第二个参数表示需要替换的子字符串,第三个参数表示需要处理的字符串,

import re

s = 'aaa@xxx.com bbb@yyy.com ccc@zzz.com'

print(re.sub('[a-z]*@', 'ABC@', s))
# ABC@xxx.com ABC@yyy.com ABC@zzz.com

和前面的replace() 方法一样,也可以指定最大的替换次数(第四个参数)

print(re.sub('[a-z]*@', 'ABC@', s, 2))
# ABC@xxx.com ABC@yyy.com ccc@zzz.com

使用同一个字符串,来替换多个子串,如果你对正则表达水熟悉的化,可以考虑在正则中加入 | 来同时匹配多个字符串。

print(re.sub('aaa|bbb|ccc', 'ABC', s))
# ABC@xxx.com ABC@yyy.com ABC@zzz.com

也可以使用在替换后的新子串中引入原先的替换子串的部分值。通过正则表达式中的 \1 等来实现。

在正则表达式中\1 代表了原先正则表达式中的第一个小括号()里面匹配的内容,\2 表示匹配的第二个,依次类推,所以,在实际中可以灵活地使用匹配的原字符串。

print(re.sub('([a-z]*)@', '\\1-123@', s))
# aaa-123@xxx.com bbb-123@yyy.com ccc-123@zzz.com

print(re.sub('([a-z]*)@', r'\1-123@', s))
# aaa-123@xxx.com bbb-123@yyy.com ccc-123@zzz.com

说明一下,就是如果字符串开头没有加上 r,则你需要多转义一次

如果你想获得正则表达式匹配后的各个组合部分(分组后的)信息,可以使用 re.subn() 函数。

re — Regular expression operations

不好理解的化,可以参看下面的例子。

t = re.subn('[a-z]*@', 'ABC@', s)
print(t)
# ('ABC@xxx.com ABC@yyy.com ABC@zzz.com', 3)

print(type(t))
# <class 'tuple'>

print(t[0])
# ABC@xxx.com ABC@yyy.com ABC@zzz.com

print(t[1])
# 3

通过位置来替换: slice

严格来说,也不算是新的替换方法,其实就是字符串的切片操作,一定程度上可以实现字符串替换的效果。

s = 'abcdefghij'

print(s[:4] + 'XXX' + s[7:])
# abcdXXXhij

s_replace = 'XXX'
i = 4
print(s[:i] + s_replace + s[i + len(s_replace):])
# abcdXXXhij

print(s[:4] + '-' + s[7:])
# abcd-hij

参考文献:


  1. 原文Replace strings in Python (replace, translate, re.sub, re.subn) | note.nkmk.me
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136638.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • GridView编辑删除操作

    GridView编辑删除操作

    2021年12月15日
    33
  • for循环break和continue[通俗易懂]

    for循环break和continue[通俗易懂]for循环像while循环一样,for可以完成循环的功能。在Python中for循环可以遍历任何序列的项目,如一个列表或者一个字符串等。for循环的格式for临时变量in列表或者字符串等:循环满足条件时执行的代码demo1name=‘itheima’forxinname:print(x)运行结果如下:itheimademo2name=‘h…

    2022年5月3日
    81
  • ubuntu配置opencv环境_opencv的安装与配置详细教程

    ubuntu配置opencv环境_opencv的安装与配置详细教程目录一、安装opencv(1)下载opencv-3.4.15数据包(2)解压缩包(3)使用cmake安装opencv​​(4)配置环境(5)检验二、实例使用(1)打开图片(2)打开摄像头显示处理视频(3)录制视频三、总结四、参考文献一、安装opencv(1)下载opencv-3.4.15数据包打开浏览器,进入下载地址ReleaseOpenCV3.4.15·opencv/opencv·GitHub,选择Source..

    2022年9月28日
    0
  • 人体检测–热释电传感器开发

    人体检测–热释电传感器开发人体检测–热释电传感器开发人体热释电传感器顾名思义是探测是否有人体通行和通过,由于它的廉价性,使得它的应用范围非常广泛。楼道里的灯,天台的报警设施等,都是利用这个来进行报警和检测。本文章将分为两个板块来介绍传感器的开发和应用。一·热释电传感器的工作原理  某些晶体,例如钽酸锂、硫酸三甘肽等受热时,晶体两端会产生数量相等、符号相反的电荷。1842年布鲁斯特将这种由温度变化引起的电极化现象正式命名为…

    2022年9月1日
    0
  • CreatePipe/CreateProcess[通俗易懂]

    CreatePipe/CreateProcess[通俗易懂]管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。匿名管道(AnonymousPipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。      匿名管道实施细则      匿名管道由Cre

    2022年7月26日
    16
  • 用WriteProcessMemory做进程注入 (非DLL注入)

    用WriteProcessMemory做进程注入 (非DLL注入)今天要完成一个项内容,运行另一个应用程序abc.exe,实现它的父进程是explorer.exe。最开始的思路是获得explorer.exe的句柄,用ShellExecute启动abc.exe。但是用explorer.exe的句柄创建的进程的父进程依然是调用和进程,而不是传入句柄的进程。看来直接的不行,只能用间接的了。把运行abc.exe的代码段写到explorer.exe的内存里面去。然后让explorer来运行这段代码。static DWORD CALLBACK ThreadProc()…{    

    2022年9月3日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号