前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在 Python 中的常见的几种字符串替换操作

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

作者头像
全栈程序员站长
发布2022-09-07 17:14:42
5.7K0
发布2022-09-07 17:14:42
举报

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

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

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

replace() 方法

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

代码语言:javascript
复制
s = 'one two one two one'

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

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

代码语言:javascript
复制
print(s.replace('one', 'XXX'))
# XXX two XXX two XXX

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

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

代码语言:javascript
复制
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() 来真正的执行。用例如下

代码语言:javascript
复制
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个参数,那么结果如下:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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() 方法一样,也可以指定最大的替换次数(第四个参数)

代码语言:javascript
复制
print(re.sub('[a-z]*@', 'ABC@', s, 2))
# ABC@xxx.com ABC@yyy.com ccc@zzz.com

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

代码语言:javascript
复制
print(re.sub('aaa|bbb|ccc', 'ABC', s))
# ABC@xxx.com ABC@yyy.com ABC@zzz.com

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

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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.cn/136638.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022年6月3,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • replace() 方法
    • 替换多个不同的字符串: translate()
      • 通过正则表达式来实现替换:re.sub, re.subn
        • 通过位置来替换: slice
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档