Python字符串替換方法有replace、translate。
replace很簡(jiǎn)單,直接字符串中的某個(gè)子串替換為另一個(gè)字符串。
>>> r"劉備是一個(gè)人的名字".replace("劉備","張飛")
'張飛是一個(gè)人的名字'
方法replace有兩個(gè)參數(shù),它將參數(shù)1替換為參數(shù)2。
>>> str_dict={"*":"\w+"}
>>> str=r"**,hello"
>>> for key in str_dict:
str=str.replace(key,str_dict[key])
>>> str
'\\w+\\w+,hello'
如上示例代碼,將要替換的字符對(duì)放入字典中,通過(guò)for循環(huán)依次將要替換的字符對(duì)進(jìn)行替換。
下面的例子展示了如果有多對(duì)要替換的字符串時(shí),通過(guò)一句代碼replace是無(wú)法同時(shí)進(jìn)行多組替換的,要想進(jìn)行多組替換,必須借助for循環(huán)的循環(huán)結(jié)構(gòu)才能實(shí)現(xiàn)。這段代碼體現(xiàn)了for循環(huán)的作用,同時(shí),也體現(xiàn)replace方法和translate方法不同之處。
>>> str_dict={"*":"\w+","l":"L"}
>>> str=str.replace(key,str_dict[key])
>>> str
'\\w+\\w+,hello'
>>> for key in str_dict:
str=str.replace(key,str_dict[key])
>>> str
'\\w+\\w+,heLLo'
下面我們來(lái)介紹一下方法translate。translate方法也是用于替換字符串特定部分的字符串方法,他可以同時(shí)替換多個(gè)字符,效率比replace高。方法translate使用前需要先創(chuàng)建一個(gè)轉(zhuǎn)換表(其實(shí)是一個(gè)類(lèi)似上面代碼中str_dict的字典),轉(zhuǎn)換表里記錄了不同Unicode之間的對(duì)應(yīng)轉(zhuǎn)換關(guān)系。
>>> t= r"劉備是一個(gè)人的名字,劉備是一個(gè)英雄"
>>> map=str.maketrans("劉備","張飛")
>>> map
{21016: 24352, 22791: 39134}
>>> t.translate(map)
'張飛是一個(gè)人的名字,張飛是一個(gè)英雄'
注意方法translate進(jìn)行的是單個(gè)Unicode碼轉(zhuǎn)換,也就是劉(Unicode碼為21016)替換為張(Unicode碼為24352),備替換為飛。
>>> t= r"劉備是一個(gè)人的名字,劉備是一個(gè)英雄,劉禪是劉備的兒子"
>>> t.translate(map)
'張飛是一個(gè)人的名字,張飛是一個(gè)英雄,張禪是張飛的兒子'
示例中劉禪替換成了張禪。
上面的示例代碼中我們使用了字符串類(lèi)str的方法maketrans,它需要兩個(gè)長(zhǎng)度相同的字符串作為參數(shù)。它可以在兩個(gè)長(zhǎng)度相同的字符串之間建立單個(gè)字符的映射關(guān)系:第一個(gè)字符中每個(gè)字符都對(duì)應(yīng)第二個(gè)字符串相應(yīng)索引出的字符,這種映射關(guān)系就是替換關(guān)系。后面利用translate方法,我們可以通過(guò)這種映射關(guān)系實(shí)現(xiàn)替換。注意,這里我么沒(méi)有使用for循環(huán)結(jié)構(gòu),這也是translate方法的強(qiáng)大之處。
上面用到的字符串類(lèi)str的方法maketrans還可以傳入可選的第三個(gè)參數(shù),這個(gè)參數(shù)指定了我們可以刪除的字符。如下代碼所示,其實(shí)方法maketrans的第三個(gè)參數(shù)還是利用了字典,只是將我們想刪除的字符映射到了None。當(dāng)然我們可以自己定義轉(zhuǎn)換表字典,來(lái)設(shè)置我們要替換的字符,以及我們想要?jiǎng)h除的字符。
>>> map=str.maketrans("劉備","張飛",",")
>>> map
{21016: 24352, 22791: 39134, 44: None}
通過(guò)本文我們介紹了對(duì)字符串進(jìn)行替換的兩種方法。兩種方法各有優(yōu)點(diǎn),當(dāng)需要進(jìn)行單個(gè)字符多次替換時(shí),使用translate方法效率高,不需要借助循環(huán)結(jié)構(gòu);當(dāng)需要進(jìn)行字符串整體替換時(shí),我們可以使用方法replace,這時(shí)候translate便無(wú)法勝任了,因?yàn)樗鼤?huì)打破字符串整體,對(duì)其他不需要替換的地方做出意外的替換。從下面的小栗子中我們可以看出replace在字符串整體替換時(shí)的優(yōu)勢(shì),它不會(huì)像translate那樣,將“劉禪”錯(cuò)誤替換成“張禪”。
>>> r"劉備是一個(gè)人的名字,劉禪是劉備的兒子".replace("劉備","張飛")
'張飛是一個(gè)人的名字,劉禪是張飛的兒子'