在 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]*)@', '\-123@', s))
# aaa-123@xxx.com bbb-123@yyy.com ccc-123@zzz.com

print(re.sub('([a-z]*)@', r'-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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Java 审计 之过滤器防御xss

    Java审计之过滤器防御xss0x00前言本文从攻击与防守两个角度来思考一些审计中的小细节。在前面两篇的xss审计中,写少了一个比较重要的点,就是Filter过滤器。都说Java的审计第一步

    2021年12月12日
  • Java 递归、DFS、回溯

    Java 递归、DFS、回溯DFS/回溯算法如果某问题的解可以由多个步骤得到,而每个步骤都有若干种选择(这些候选方案集可能会依赖之前做出的选择),且可以用递归枚举法实现,则它的工作方式可以用解答树来描述。全排列问题输出数字1~N所能组成的所有全排列publicclassA{/***全排列**@paramargs*/staticVector<Integer>vector=newVector<>();s

  • 【Lucene】TokenStream-语汇单元的项、偏移量、类型和位置增量

    【Lucene】TokenStream-语汇单元的项、偏移量、类型和位置增量代码:packagecom.tan.code;importjava.io.IOException;importjava.io.StringReader;importorg.apache.lucene.analysis.Analyzer;importorg.apache.lucene.analysis.TokenStream;importorg.apache.lucene.

  • pycharm汉化包下载[通俗易懂]

    pycharm汉化包下载[通俗易懂]把解压后的文件放到pycharm安装目录lib文件夹下即可链接:https://pan.baidu.com/s/126-yg7ojwwryywBzUuVEhQ提取码:v5j0

  • oracle数据库去重查询_oracle高效去重

    oracle数据库去重查询_oracle高效去重数据库多字段去重方法介绍:distinct关键字、groupby 、row_number()over()

  • win10总显示打印机未连接服务器,win10安装打印机一直未响应。。。「建议收藏」

    win10总显示打印机未连接服务器,win10安装打印机一直未响应。。。「建议收藏」Win10安装打印机驱动的方法1.首先将打印机与电脑进行连接,目前大部分打印机都是通过USB数据线与电脑U口进行连接的。在打印机连接完成后,我们需要通过以下方法查看打印机连接状态是否正常:2.从打开的“控制面板”界面中,点击“硬件和声音”栏目中的“查看设备和打印机”按钮进入。3.此时将打开“设备和打印机”窗口,从此界面中就可以找到“未指定”的设备,此设备便是当前所连接的打印机。4.Win10正式版…

发表回复

您的电子邮箱地址不会被公开。

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