在 Python 中的常见的几种字符串替换操作(Python.org)
基于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
參考文獻:
- 原文Replace strings in Python (replace, translate, re.sub, re.subn) | note.nkmk.me
總結
以上是生活随笔為你收集整理的在 Python 中的常见的几种字符串替换操作(Python.org)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重装系统后sqlserver安装失败_W
- 下一篇: mediarecorder路径设置为lo