大家好,又见面了,我是你们的朋友全栈君。
基于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()
转换关系存放在 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
参考文献:
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136638.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...