文字列内の文字のインスタンスを置き換える


119

セミコロン(iで指定された位置)をコロンで単純に置き換えようとするこの単純なコードは機能しません。

for i in range(0,len(line)):
     if (line[i]==";" and i in rightindexarray):
         line[i]=":"

エラーが出ます

line[i]=":"
TypeError: 'str' object does not support item assignment

セミコロンをコロンに置き換えるにはどうすればよいですか?その関数はインデックスを取らないため、replaceの使用は機能しません-置き換えたくないセミコロンがあるかもしれません。

文字列には、「Hei der!; Hello there;!;」のように、セミコロンをいくつでも含めることができます。

置き換えたいものを知っています(文字列にインデックスがあります)。インデックスを使用できないため、置換を使用しても機能しません。


1
あなたはstr.replace()BIF を知っていますか?
LarsVegas 2012年

2
はい、質問で説明したとおりです。また、それがうまくいかない理由も説明しました。
Unfun Cat

str.find() 代わりにを使用してセミコロンの位置を見つけ、スライスを使用して部分文字列を抽出します。
LarsVegas 2012年

1
その場合、有効な置き換えを構成するものをより具体的にする必要があります。機能しないコードは、文字列が変更可能である場合、文字列内のすべてのセミコロンを置き換えます。
Martijn Pieters

1
@TheUnfunCat:そもそもどのようにしてインデックスを取得していますか?全体に対してより良い解決策があるかもしれません(例:正規表現)
nneonneo

回答:


206

Pythonの文字列は不変なので、それらをリストとして扱い、インデックスに割り当てることはできません。

.replace()代わりに使用:

line = line.replace(';', ':')

特定のセミコロンのみを置き換える必要がある場合は、より具体的にする必要があります。スライスを使用して、置換する文字列のセクションを分離できます。

line = line[:10].replace(';', ':') + line[10:]

これにより、文字列の最初の10文字のセミコロンがすべて置き換えられます。


これはユニコード文字で機能しますか?うまくいかないようです。
Steven2163712

@ Steven2163712:すべてのテキストはUnicodeであるため、はい、これはすべての文字で正常に機能します。具体的な例がなければ、私はあなたがあなたの特定の問題を修正するのを助けることができません。
Martijn Pieters

62

使用したくない場合は、以下を実行して、特定のインデックスで任意の文字をそれぞれの文字に置き換えることができます。 .replace()

word = 'python'
index = 4
char = 'i'

word = word[:index] + char + word[index + 1:]
print word

o/p: pythin

7
これは受け入れられる答えでなければなりません。質問に直接答えます。これは、これまでに見つけた最も簡単な方法です。
フレアキャット

24

文字列をリストに変換します。その後、文字を個別に変更できます。次に、それを一緒に戻すことができます.join

s = 'a;b;c;d'
slist = list(s)
for i, c in enumerate(slist):
    if slist[i] == ';' and 0 <= i <= 3: # only replaces semicolons in the first part of the text
        slist[i] = ':'
s = ''.join(slist)
print s # prints a:b:c;d

6

単一のセミコロンを置き換える場合:

for i in range(0,len(line)):
 if (line[i]==";"):
     line = line[:i] + ":" + line[i+1:]

しかし、それをテストしたことはありません。


3
これは機能します(+1)が、「;」に遭遇するたびに新しい文字列を作成するため、非常に非効率的です。
inspectorG4dget

@ inspectorG4dget、あなたは正しい、それは迅速で汚い-一度だけ-ソリューション。
Vic

実際、@ inspectorG4dget、受け入れられた答えは同じ問題に悩まされていませんか?
Vic

2
line.replace(src,dst)ではない。line[:10].replace(src,dst) + line[10:]しますが、それほど深刻ではありません。と仮定しline = ';'*12ます。ソリューションは、新しい文字列を12回構築します。承認された解決策は1回です。
inspectorG4dget

3

これは少し一般的なケースをカバーするはずですが、目的に応じてカスタマイズできるはずです

def selectiveReplace(myStr):
    answer = []
    for index,char in enumerate(myStr):
        if char == ';':
            if index%2 == 1: # replace ';' in even indices with ":"
                answer.append(":")
            else:
                answer.append("!") # replace ';' in odd indices with "!"
        else:
            answer.append(char)
    return ''.join(answer)

お役に立てれば


3

文字列の文字に単純に値を割り当てることはできません。このメソッドを使用して、特定の文字の値を置き換えます。

name = "India"
result=name .replace("d",'*')

出力:In * ia

また、最初の文字を除く最初の文字のすべての出現に対してsay *を置き換える場合は、たとえば、文字列=バブル出力=バ**ル

コード:

name = "babble"
front= name [0:1]
fromSecondCharacter = name [1:]
back=fromSecondCharacter.replace(front,'*')
return front+back

1

変数「n」で指定されたインデックス値で置き換える場合は、以下を試してください。

def missing_char(str, n):
 str=str.replace(str[n],":")
 return str

1
このソリューションの問題は、n番目の文字のすべての出現箇所を置き換え、
質問者は

まさに、貧弱な解決策です!
Erhard Dinhobl 2017

1

これはどう:

sentence = 'After 1500 years of that thinking surpressed'

sentence = sentence.lower()

def removeLetter(text,char):

    result = ''
    for c in text:
        if c != char:
            result += c
    return text.replace(char,'*')
text = removeLetter(sentence,'a')

1

別のリストを作成せずに文字列で.replace()メソッドを効果的に使用するには、たとえば、空白を含む文字列を含むリストのユーザー名を見て、各ユーザー名文字列の空白をアンダースコアに置き換えます。

usernames = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

各ユーザー名の空白を置き換えるには、Pythonでrange関数を使用することを検討してください。

for i in range(len(usernames)):
    usernames[i] = usernames[i].lower().replace(" ", "_")

print(usernames)

0

特定のインデックスにある文字を置き換えるための関数は次のとおりです。

def replace_char(s , n , c):
    n-=1
    s = s[0:n] + s[n:n+1].replace(s[n] , c) + s[n+1:]
    return s

ここで、sは文字列、nはインデックス、cは文字です。


0

このメソッドは、特定のインスタンスで文字または文字列を置き換えるために作成しました。インスタンスは0から始まります(オプションのinst引数を1に、test_instance変数を1に変更すると、これを簡単に1に変更できます。

def replace_instance(some_word, str_to_replace, new_str='', inst=0):
    return_word = ''
    char_index, test_instance = 0, 0
    while char_index < len(some_word):
        test_str = some_word[char_index: char_index + len(str_to_replace)]
        if test_str == str_to_replace:
            if test_instance == inst:
                return_word = some_word[:char_index] + new_str + some_word[char_index + len(str_to_replace):]
                break
            else:
                test_instance += 1
        char_index += 1
    return return_word

0

あなたはこれを行うことができます:

string = "this; is a; sample; ; python code;!;" #your desire string
result = ""
for i in range(len(string)):
    s = string[i]
    if (s == ";" and i in [4, 18, 20]): #insert your desire list
        s = ":"
    result = result + s
print(result)

0

名前= ["Joey Tribbiani"、 "Monica Geller"、 "Chandler Bing"、 "Phoebe Buffay"]

ユーザー名= []

for i in names:
    if " " in i:
        i = i.replace(" ", "_")
    print(i)

o、p Joey_Tribbiani Monica_Geller Chandler_Bing Phoebe_Buffay


1
ありがとう、ムハンマド私は初心者です。
Kasem007
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.