2010-03-31 9 views
72

स्ट्रिंग को प्रतिस्थापित करने के लिए पाइथन में कोई त्वरित तरीका है, लेकिन शुरुआत से शुरू होने की बजाय replace अंत से शुरू होता है? उदाहरण के लिए:rreplace - एक स्ट्रिंग में अभिव्यक्ति की अंतिम घटना को कैसे प्रतिस्थापित करें?

>>> def rreplace(old, new, occurrence) 
>>>  ... # Code to replace the last occurrences of old by new 

>>> '<div><div>Hello</div></div>'.rreplace('</div>','</bad>',1) 
>>> '<div><div>Hello</div></bad>' 
+3

अच्छा सवाल, इस तरह की एक साधारण समस्या के जटिल समाधानों का निर्धारण। –

उत्तर

112
>>> def rreplace(s, old, new, occurrence): 
... li = s.rsplit(old, occurrence) 
... return new.join(li) 
... 
>>> s 
'1232425' 
>>> rreplace(s, '2', ' ', 2) 
'123 4 5' 
>>> rreplace(s, '2', ' ', 3) 
'1 3 4 5' 
>>> rreplace(s, '2', ' ', 4) 
'1 3 4 5' 
>>> rreplace(s, '2', ' ', 0) 
'1232425' 
+0

+1 मुझे लगता है कि यह भी काफी तेज होगा। –

+6

बहुत अच्छा! मेरे प्रोग्राम (> 500 अक्षरों) में एक विशिष्ट स्ट्रिंग में अभिव्यक्ति की अंतिम घटना को बदलने के एक अवैज्ञानिक बेंचमार्क में, आपका समाधान एलेक्स के समाधान से तीन गुना तेज और मार्क के समाधान से चार गुना तेज था। आपके उत्तरों के लिए सभी को धन्यवाद! बेंचमार्क परिणाम के लिए – Barthelemy

+0

धन्यवाद –

7

मैं यह दिखाने का नहीं कह रहा हूं कि यह करने का यह सबसे प्रभावी तरीका है, लेकिन यह एक आसान तरीका है। यह प्रश्न में सभी स्ट्रिंग्स पराजयों, उलट तारों पर str.replace का उपयोग कर एक साधारण स्थानापन्न निष्पादित, तो परिणाम वापस सही तरीके दौर पराजयों:

>>> def rreplace(s, old, new, count): 
...  return (s[::-1].replace(old[::-1], new[::-1], count))[::-1] 
... 
>>> rreplace('<div><div>Hello</div></div>', '</div>', '</bad>', 1) 
'<div><div>Hello</div></bad>' 
1

यहाँ समस्या के लिए एक पुनरावर्ती समाधान है:

def rreplace(s, old, new, occurence = 1): 

    if occurence == 0: 
     return s 

    left, found, right = s.rpartition(old) 

    if found == "": 
     return right 
    else: 
     return rreplace(left, old, new, occurence - 1) + new + right 
3

आप जानते हैं कि 'पुराने' स्ट्रिंग एक regex के साथ कोई विशेष वर्ण आप यह कर सकते नहीं है, तो:

In [44]: s = '<div><div>Hello</div></div>' 

In [45]: import re 

In [46]: re.sub(r'(.*)</div>', r'\1</bad>', s) 
Out[46]: '<div><div>Hello</div></bad>' 
संबंधित मुद्दे

 संबंधित मुद्दे