在 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)
上一篇 2022年6月3日 上午10:00
下一篇 2022年6月3日 上午10:00


相关推荐

  • IDEA汉化后转回英文,只要三步

    IDEA汉化后转回英文,只要三步如果你觉得本文对你有帮助 麻烦动动手指顶一下

    2026年3月18日
    2
  • 手把手教你用python发送邮件

    手把手教你用python发送邮件用 python 群发邮件 1 用 python 群发邮件 2 模块 3 目标拆解 3 1 版本 1 0 给自己发送一句简单的话 3 2 版本 2 0 在版本 1 0 的基础上 增添发件人 邮件标题和正文内容 3 3 版本 3 0 在版本 2 0 的基础上从给单人发送邮件到给多人发送邮件 1 用 python 群发邮件今天带大家学习如何用 python 发送邮件 2 模块 利用 python 发送邮件我们需要用到两个 python 的内置模块 smtplib 和 email 其中 smtplib 模块负责发送邮件 而 email 模块负责构造邮件内容

    2026年3月19日
    2
  • 京东签到在哪儿_python爬虫教程

    京东签到在哪儿_python爬虫教程京东签到在哪里?有哪些步骤呢?最近很多朋友都在咨询小编京东签到在哪里,其实这个问题很简单,但是为了能够使更多的亲们了解京东签到在哪里,小编专门整理了这篇文章,希望阅读过后的亲们可以明确京东签到这个问题的答案。京东签到是为了给京东会员提供购物赠京豆、生日礼包、自营免运费、专享礼包等权益。提高京东商城会员之间的互动,增加用户粘性。一、京东签到在哪里,可以签到的入口1、京东金融APP打开后,右上角那个日…

    2026年1月15日
    5
  • kubeedge 安装部署(适用于Ubuntu)「建议收藏」

    kubeedge 安装部署(适用于Ubuntu)「建议收藏」kubeedge安装部署(适用于Ubuntu)基础环境:安装了Ubuntu18.04操作系统的两台虚拟机(查看操作系统版本命令:cat/etc/os-release)部署kubeedge1.1.0版本根据keadm源码安装部署步骤整理(无法直接使用keadm工具完成部署)一、配置源,写入以下内容到/etc/apt/sources.listroot@ubuntu:…

    2022年7月21日
    33
  • 域渗透之 pre-auth用户枚举

    域渗透之pre-auth用户枚举适用场景与优点适用于在域外对域用户进行用户枚举和爆破使用Kerberospre-authbruteforcing的速度快,并且不会产生日志。适用场景:在

    2021年12月13日
    63
  • 解决VS控制台窗口自动关闭的问题

    解决VS控制台窗口自动关闭的问题方法一 Ctrl F5 如果你的项目创建时选择的是 Win32 控制台应用程序 那么使用 Ctrl F5 运行程序就可以了 如果你选的是 空项目 你需要修改项目属性 才能让这个方法生效 方法二 设置断点在代码结束或返回前设置断点 方法三 system pause 在代码结束或返回前加一句话 system pause 需要头文件 includestdli h

    2026年3月17日
    1

发表回复

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

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