rreplace-文字列内で最後に出現した式を置き換える方法は?


139

Pythonで文字列を置き換える簡単な方法はあり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
そのような単純な問題に対する複雑な解決策から判断すると、良い質問です。
Justin Ardini、2010年

3
以下の回答には、この質問に追加するのに9年(!)かかったエレガントな1行があります。下にスクロールして見つけるだけです。
ジョンD

回答:


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文字)で最後に出現した式を置き換える非科学的なベンチマークでは、ソリューションはAlexのソリューションよりも3倍、Markのソリューションよりも4倍高速でした。あなたの答えをありがとう!
Barthelemy

2
ありがとう、うまくいきました。この.replaceメソッドは、最初のn回の出現を置き換えるように指示する3番目のオプションの引数 'count'を取ります。それが-1のようなものになるとしたら直感的ではなかったでしょうが、残念ながらそれはできないので、私たちはあなたの解決策を必要としています。
カルダモン2018

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

部分文字列oldのすべての出現箇所をnewで置き換えた文字列sのコピーを返します。最初の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.