পুনরূদ্ধার - একটি স্ট্রিং মধ্যে একটি অভিব্যক্তি শেষ ঘটনাটি প্রতিস্থাপন কিভাবে?


139

পাইথনগুলিতে স্ট্রিংগুলি প্রতিস্থাপনের জন্য কী দ্রুত উপায় আছে তবে শুরু থেকে শুরু করার পরিবর্তে replaceশেষ থেকে শুরু করে? উদাহরণ স্বরূপ:

>>> 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>'

5
ভালো প্রশ্ন, এত সাধারণ সমস্যার জটিল সমাধান বিচার করে।
জাস্টিন আর্দিনি

3
নীচে উত্তরগুলিতে একটি মার্জিত ওয়ান-লাইনার রয়েছে যা এই প্রশ্নের সাথে যুক্ত হতে 9 বছর (!) সময় নিয়েছিল, এটি সন্ধান করার জন্য কেবল নিচে স্ক্রোল করুন।
জন ডি

উত্তর:


196
>>> 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'

9
খুব সুন্দর! আমার প্রোগ্রামে (> 500 অক্ষর) একটি সাধারণ স্ট্রিংয়ে একটি অভিব্যক্তিটির শেষ ঘটনাটি প্রতিস্থাপনের একটি অবৈজ্ঞানিক মানদণ্ডে, আপনার সমাধানটি অ্যালেক্সের সমাধানের চেয়ে তিনগুণ এবং মার্কের সমাধানের চেয়ে চারগুণ দ্রুত ছিল। আপনার উত্তরের জন্য সকলকে ধন্যবাদ!
বার্থলেমি

2
ধন্যবাদ, এটি কাজ করে। .replaceপদ্ধতি এক তৃতীয়াংশ ঐচ্ছিক যুক্তি 'গণনা' যা বলে প্রথম এন ঘটনার প্রতিস্থাপন করতে সময় লাগে। এটি যদি স্বজ্ঞাত না হত তবে এটির মতো -1 লেগেছে তবে দুর্ভাগ্যক্রমে এটি হবে না, সুতরাং আমাদের আপনার সমাধানের প্রয়োজন।
এলাচি

17

আমি এটি ভান করতে যাচ্ছি না এটি এটি করার সবচেয়ে দক্ষ উপায়, তবে এটি একটি সহজ উপায়। এটি প্রশ্নের মধ্যে থাকা সমস্ত স্ট্রিংকে 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>'

10

এখানে একটি ওয়ান-লাইনার:

result = new.join(s.rsplit(old, maxreplace))

স্ট্রিং এর একটি কপি ফিরুন গুলি সাবস্ট্রিং এর সমস্ত সংঘটন সঙ্গে পুরাতন দ্বারা প্রতিস্থাপিত নতুন । প্রথম ম্যাক্সর্লেস ইভেন্টগুলি প্রতিস্থাপন করা হয়।

এবং এটি ব্যবহারের একটি সম্পূর্ণ উদাহরণ:

s = 'mississipi'
old = 'iss'
new = 'XXX'
maxreplace = 1

result = new.join(s.rsplit(old, maxreplace))
>>> result
'missXXXipi'

1
নিস! লাইনগুলি থেকে ট্রেলিং কমাগুলি অপসারণ করতে এটি ব্যবহার করুন: line = "".join(line.rsplit(",", 1))পরে প্যাডিং স্পেস রাখার সময়।
নাতনী

9

কেবল স্ট্রিংটি বিপরীত করুন, প্রথম ঘটনাটি প্রতিস্থাপন করুন এবং এটি আবার বিপরীত করুন:

mystr = "Remove last occurrence of a BAD word. This is a last BAD word."

removal = "BAD"
reverse_removal = removal[::-1]

replacement = "GOOD"
reverse_replacement = replacement[::-1]

newstr = mystr[::-1].replace(reverse_removal, reverse_replacement, 1)[::-1]
print ("mystr:", mystr)
print ("newstr:", newstr)

আউটপুট:

mystr: Remove last occurence of a BAD word. This is a last BAD word.
newstr: Remove last occurence of a BAD word. This is a last GOOD word.

5

আপনি যদি জানেন যে 'পুরানো' স্ট্রিংটিতে কোনও বিশেষ অক্ষর নেই তবে আপনি এটি একটি রেজেক্সের সাহায্যে করতে পারেন:

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>'

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.