文字列内の部分文字列の最後の出現を検索し、それを置き換えます


104

そのため、同じ形式の文字列の長いリストがあり、最後の「。」を検索したいと思います。それぞれの文字を「。-」に置き換えます。私はrfindを使用してみましたが、これを適切に利用できていないようです。


回答:


163

これでうまくいくはずです

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:]

1
どうもありがとう。それを1分間研究する必要があります...これはスライスを利用していますよね?
Adam Magyar

@AdamMagyarはい、container [a:b]は、コンテナの最大b-1のインデックスからスライスします。「a」を省略すると、デフォルトで0になります。「b」を省略すると、デフォルトでlen(container)になります。plus演算子は連結するだけです。あなたが指摘したrfind関数は、置換操作が行われるべきインデックスを返します。
Aditya Sihag 2013年

26

右から置き換えるには:

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

使用中で:

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

1
私は間違いなくこのソリューションがreplacements=None好きですが、パラメーターを省略すると関数がエラーになるため、パラメーターを指定するとエラーのように見えます(Python 2.7で試してみました)。私は、デフォルト値を削除するか、-1(無制限の置換)に設定するか、より適切なものにするreplacements=1(OPが望むものに従って、この特定の関数のデフォルトの動作であると思う)ことをお勧めします。ドキュメントによると、このパラメーターはオプションですが、指定する場合はintでなければなりません。
remarkov 2016年

場合には誰もがこのためのワンライナーを望んでいます:". -".join("asd.asd.asd.".rsplit(".", 1))。あなたがしているのは、右側から文字列分割を1回実行し、置換を使用して文字列を再び結合することだけです。
bsplosion

14

私は正規表現を使用します:

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

2
これは、ドットがまったくない場合に機能する唯一の答えです。私はかかわらず、先読みを使用したい:\.(?=[^.]*$)
ゲオルク・

6

1つのライナーは次のようになります。

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


1
これは間違いです。あなたは文字列を逆にし、それを置き換え、そしてそれを元に戻します。あなたは.replace逆転したストリングでやっている。渡された両方の文字列replaceも逆にする必要があります。そうしないと、もう一度文字列を逆にしたときに、挿入したばかりの文字が逆になります。これは、1文字を1文字に置き換える場合にのみ使用できます。さらに、将来誰かが変更する必要があり、単語がsdrawkcabと書かれている理由を知りたくなった場合に備えて、これをコードに含めません。
ボリス

1

右から単語の最初の出現を置き換える以下の関数を使用できます。

def replace_from_right(text: str, original_text: str, new_text: str) -> str:
    """ Replace first occurrence of original_text by new_text. """
    return text[::-1].replace(original_text[::-1], new_text[::-1], 1)[::-1]

0
a = "A long string with a . in the middle ending with ."

#任意の文字列の最後の出現のインデックスを検索する場合、この場合、#の最後の出現のインデックスを検索します

index = a.rfind("with") 

#インデックスは0から始まるため、結果は44になります。


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

単一のAditya Sihagの回答rfind

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

これにより、置換文字列も逆になります。それ以外は、これはrootの答えの繰り返しであり、私がそこで言うように、かなり非効率的です。
Gareth Latty、2013年

@Lattywareそれは逆転するということaですか?
Alex L

'. -'つまり、出力が逆になります。
Gareth Latty、2013年

ユーザーが文字列リテラルを手動で元に戻すことを期待するのは良い考えではありません。間違いが発生しやすく、不明確です。
Gareth Latty、2013年

@Lattyware同意。私はそれをvarにしました。(私はそれが非効率的な方法であり、すべての場合に適しているわけではないことに気づきます-あなたreplace_rightはずっと良いです)
Alex L
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.