在 Python 中的常见的几种字符串替换操作(Python.org)
基于Python3.7.3中,主要的方法有
- 替換子串:replace()
- 替換多個(gè)不同的字符串:re.sub(),re.subn()
- 用正則表達(dá)式替換:re.sub(),re.subn()
- 根據(jù)位置來(lái)替換:slice()
replace() 方法
比如,輸入的字符串為’one two one two one’,第一個(gè)參數(shù)為替換前的參數(shù),第二個(gè)為替換后的參數(shù)。默認(rèn)會(huì)替換字符串中的所有符合條件的字符串。
s = 'one two one two one'
print(s.replace(' ', '-'))
# one-two-one-two-one
也可以指定一個(gè)最大替換次數(shù)值,一旦指定,只會(huì)替換前面匹配的n個(gè)字符串。
print(s.replace('one', 'XXX'))
# XXX two XXX two XXX
print(s.replace('one', 'XXX', 2))
# XXX two XXX two one
當(dāng)然,也可以支持鏈?zhǔn)降亩啻握{(diào)用實(shí)現(xiàn)多重條件過(guò)濾。(但最好還是使用下面的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
替換多個(gè)不同的字符串: translate()
translate官方文檔
轉(zhuǎn)換關(guān)系存放在 str.maketrans() 方法來(lái)創(chuàng)建。并且調(diào)用 translate() 來(lái)真正的執(zhí)行。用例如下
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 方法中是一個(gè)字典參數(shù),第一個(gè)參數(shù)(key)為替換前的參數(shù),第二個(gè)參數(shù)(value)為替換后的參數(shù)(為None表示移除替換前的參數(shù))。
str.maketrans()也可以使用三個(gè)字符串作為參數(shù),而不是字典。
如果不是一個(gè)字典參數(shù),而是如下的兩個(gè)參數(shù)或者3個(gè)參數(shù),那么結(jié)果如下:
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
在上面的情況下,第一個(gè)和第二個(gè)參數(shù)的長(zhǎng)度必須匹配。在兩個(gè)參數(shù)的情況下,會(huì)將第一個(gè)參數(shù)的字符,依次的映射成第二個(gè)參數(shù)的字符(o-> X,w-> Y)。第三個(gè)參數(shù)表示在映射完的結(jié)果之后,需要移除的字符。
通過(guò)正則表達(dá)式來(lái)實(shí)現(xiàn)替換:re.sub, re.subn
re — Regular expression operations
在第一個(gè)參數(shù)中輸入正則表達(dá)式,第二個(gè)參數(shù)表示需要替換的子字符串,第三個(gè)參數(shù)表示需要處理的字符串,
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() 方法一樣,也可以指定最大的替換次數(shù)(第四個(gè)參數(shù))
print(re.sub('[a-z]*@', 'ABC@', s, 2))
# ABC@xxx.com ABC@yyy.com ccc@zzz.com
使用同一個(gè)字符串,來(lái)替換多個(gè)子串,如果你對(duì)正則表達(dá)水熟悉的化,可以考慮在正則中加入 | 來(lái)同時(shí)匹配多個(gè)字符串。
print(re.sub('aaa|bbb|ccc', 'ABC', s))
# ABC@xxx.com ABC@yyy.com ABC@zzz.com
也可以使用在替換后的新子串中引入原先的替換子串的部分值。通過(guò)正則表達(dá)式中的 \1 等來(lái)實(shí)現(xiàn)。
在正則表達(dá)式中\1 代表了原先正則表達(dá)式中的第一個(gè)小括號(hào)()里面匹配的內(nèi)容,\2 表示匹配的第二個(gè),依次類推,所以,在實(shí)際中可以靈活地使用匹配的原字符串。
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
說(shuō)明一下,就是如果字符串開(kāi)頭沒(méi)有加上 r,則你需要多轉(zhuǎn)義一次。
如果你想獲得正則表達(dá)式匹配后的各個(gè)組合部分(分組后的)信息,可以使用 re.subn() 函數(shù)。
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
通過(guò)位置來(lái)替換: slice
嚴(yán)格來(lái)說(shuō),也不算是新的替換方法,其實(shí)就是字符串的切片操作,一定程度上可以實(shí)現(xiàn)字符串替換的效果。
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
參考文獻(xiàn):
- 原文Replace strings in Python (replace, translate, re.sub, re.subn) | note.nkmk.me
總結(jié)
以上是生活随笔為你收集整理的在 Python 中的常见的几种字符串替换操作(Python.org)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 重装系统后sqlserver安装失败_W
- 下一篇: C语言 数组倒序输出数字「建议收藏」