2012-03-30 62 views
35

我想在Python中做一個字符串替換,但只做第一個從右到左的實例。在一個理想的世界,我想有:在Python中從右到左的字符串替換?

myStr = "mississippi" 
print myStr.rreplace("iss","XXX",1) 

> missXXXippi 

什麼是這樣做的最佳方式,因爲rreplace不存在?

+6

相對的影響:http://stackoverflow.com/q/2556108/989121 – georg 2012-03-30 13:11:49

回答

58

rsplitjoin可以用來模擬rreplace

>>> 'XXX'.join('mississippi'.rsplit('iss', 1)) 
'missXXXippi' 
+5

+1的解決方案,容易被隨後的程序員理解。 – strongMA 2013-10-23 22:30:33

+0

+1這是最好的答案! – uccie 2014-03-16 16:22:50

+1

與其他解決方案相反,這個解決方案也很容易擴展,可以從右側執行多個替換。 – Anaphory 2015-09-27 09:46:34

20
>>> myStr[::-1].replace("iss"[::-1], "XXX"[::-1], 1)[::-1] 
'missXXXippi' 
+8

就是這樣*不*新手友好... :) – brice 2012-03-30 13:05:10

+0

我假設這是做什麼@ sleeplessnerd的,但沒有「反向」? – fredley 2012-03-30 13:05:24

+0

@brice如果它有效,我不在乎 – fredley 2012-03-30 13:05:47

0

這是一種骯髒的黑客,但你可以扭轉字符串,並用反向字符串替換。

"mississippi".reverse().replace('iss'.reverse(), 'XXX'.reverse(),1).reverse() 
+11

字符串沒有'reverse()'方法。 – 2012-03-30 13:04:29

6

你可能逆轉,像這樣的字符串:

myStr[::-1] 

更換隻需添加.replace

print myStr[::-1].replace("iss","XXX",1) 

但是現在你的字符串向後,所以重新扭轉這種局面:

myStr[::-1].replace("iss","XXX",1)[::-1] 

,你就完成了。 如果你的替換字符串是靜態的,只需在文件中反轉它們以減少開銷。 如果沒有,同樣的技巧將起作用。

myStr[::-1].replace("iss"[::-1],"XXX"[::-1],1)[::-1] 
+2

你忘了翻轉匹配的文本和替換文本 – sleeplessnerd 2012-03-30 13:09:37

+1

不,我最後說了如果你想讓它們顛倒過來該怎麼做。 – Serdalis 2012-03-30 13:27:08

14
>>> re.sub(r'(.*)iss',r'\1XXX',myStr) 
'missXXXippi' 

正則表達式引擎cosumes所有的字符串,然後開始回溯,直到iss被發現。然後它將所找到的字符串替換爲所需的模式。


一些速度tests

將溶液用[::-1]原來是更快。

re的解決方案對於長字符串(超過100萬個符號)的速度更快。

+0

這比短字符串(<20個字符)的反轉方法更有效嗎? – fredley 2012-03-30 13:13:50

+0

@TomMedley我不知道。我沒有做任何速度測試。據我所知,回溯很慢。如果'iss'在字符串的開始位置,那麼在引擎找到'iss'匹配的位置之前,需要花很長時間才能確定。 – ovgolovin 2012-03-30 13:15:59

+0

@TomMedley但我不認爲其他解決方案中的[[:: - 1]'更快:) – ovgolovin 2012-03-30 13:17:28

2
def rreplace(s, old, new): 
    try: 
     place = s.rindex(old) 
     return ''.join((s[:place],new,s[place+len(old):])) 
    except ValueError: 
     return s