2013-01-24 138 views

回答

117

這應該這樣做

old_string = "this is going to have a full stop. some written sstuff!" 
k = old_string.rfind(".") 
new_string = old_string[:k] + ". - " + old_string[k+1:] 
+12

一個襯墊非常棒,但最好是'str.rfind()'來提高效率。 –

+0

非常感謝。一定要研究一下......這是利用切片,對吧? –

+0

@AdamMagyar是的,容器[a:b]從容器的最多b-1索引切片。如果'a'被省略,那麼它默認爲0;如果省略'b',則默認爲len(容器)。加號運算符只是連接在一起。您指出的rfind函數將返回替換操作應發生的索引。 –

10

我會使用一個正則表達式:

import re 
new_list = [re.sub(r"\.(?=[^.]*$)", r". - ", s) for s in old_list] 
+1

這是唯一可行的答案如果根本沒有點。儘管如此,我會使用一個lookahead:'\。(?= [^。] * $)' – georg

+0

@ thg435:好主意,謝謝! –

-1

幼稚的做法:

a = "A long string with a . in the middle ending with ." 
fchar = '.' 
rchar = '. -' 
a[::-1].replace(fchar, rchar[::-1], 1)[::-1] 

Out[2]: 'A long string with a . in the middle ending with . -' 

阿迪亞Sihag的回答有一個rfind

pos = a.rfind('.') 
a[:pos] + '. -' + a[pos+1:] 
+0

這也反轉了替換字符串。除此之外,這是根本答案的重複,並且,正如我所說的那樣,效率很低。 –

+0

@Lattyware你的意思是顛倒'a'? –

+0

我的意思是顛倒''。在輸出中。 –

23

要從右取代:

def replace_right(source, target, replacement, replacements=None): 
    return replacement.join(source.rsplit(target, replacements)) 

在使用中:

>>> replace_right("asd.asd.asd.", ".", ". -", 1) 
'asd.asd.asd. -' 
+2

+1,我喜歡這個版本。簡單而有效,並且沒有明顯的低效率。 –

+0

啊,我很喜歡這個。還要感謝! –

+3

爲了清晰起見,我採取了一些自由行爲來重構你的例子,並使其與OP的例子相匹配。我很難改變答案 - 但核心內容是相同的,我覺得它改善了它,所以希望應該沒問題。 –

7

一個一個班輪將是:

str=str[::-1].replace(".",".-",1)[::-1]

+1

很好地取代最後一次發生! – Lydia

相關問題