Bir dizedeki bir karakterin örneklerini değiştirme


120

Noktalı virgülleri (i-belirtilen konumlarda) iki nokta üst üste ile değiştirmeye çalışan bu basit kod çalışmaz:

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

Hata veriyor

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

Noktalı virgülleri iki nokta üst üste ile değiştirmek için bu sorunu nasıl çözebilirim? Değiştirmeyi kullanmak, bu işlev indeks almadığından çalışmaz - değiştirmek istemediğim bazı noktalı virgüller olabilir.

Misal

Dizede herhangi bir sayıda noktalı virgül olabilir, örneğin "Hei der!; Merhaba;!;"

Hangilerini değiştirmek istediğimi biliyorum (onların dizini dizede var). Onunla bir dizin kullanamadığım için değiştir'i kullanmak işe yaramıyor.


1
str.replace()BIF'i biliyor musunuz ?
LarsVegas

2
Evet, soruda açıkladığım gibi. Bunun benim için neden işe yaramadığını da açıkladım.
The Unfun Cat

str.find() Bunun yerine noktalı virgülün konumunu bulmak için kullanın , ardından alt dizeyi çıkarmak için dilimlemeyi kullanın.
LarsVegas

1
O halde neyin geçerli bir yedek oluşturduğu konusunda daha spesifik olmanız gerekir; çalışmayan kodunuz, eğer değiştirilebilir olsaydı, dizedeki tüm noktalı virgüllerin yerini alırdı.
Martijn Pieters

1
@TheUnfunCat: En başta endeksleri nasıl elde ediyorsunuz? Her şeye daha iyi bir çözüm olabilir (örneğin,
normal ifadeler

Yanıtlar:


207

Python'daki dizeler değişmezdir, bu nedenle onları bir liste olarak ele alıp endekslere atayamazsınız.

.replace()Bunun yerine kullanın :

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

Yalnızca belirli noktalı virgülleri değiştirmeniz gerekiyorsa, daha spesifik olmanız gerekir. Dizenin değiştirilecek bölümünü izole etmek için dilimlemeyi kullanabilirsiniz:

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

Bu, dizenin ilk 10 karakterindeki tüm noktalı virgülleri değiştirir.


Bu unicode karakterlerle çalışır mı? Benim için işe yaramıyor gibi görünüyor.
Steven2163712

@ Steven2163712: Tüm metinler Unicode, yani evet, bu tüm karakterlerde iyi çalışıyor. Somut bir örnek olmadan, özel probleminizi çözmenize yardımcı olamam.
Martijn Pieters

62

Kullanmak istemiyorsanız, herhangi bir karakteri belirli bir dizindeki ilgili karakterle değiştirmek için aşağıdakileri yapabilirsiniz. .replace()

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

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

o/p: pythin

7
Bu kabul edilen cevap olmalı, soruyu doğrudan cevaplıyor. Bu şimdiye kadar bulduğum en kolay yöntem.
Flare Cat

24

Dizeyi bir listeye çevirin; daha sonra karakterleri ayrı ayrı değiştirebilirsiniz. Daha sonra aşağıdakilerle tekrar bir araya getirebilirsiniz .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

Tek bir noktalı virgül değiştirmek istiyorsanız:

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

Havent yine de test etti.


3
Bu işe yarayacaktır (+1), ancak bir ';' ile her karşılaştığınızda yeni bir dizge oluşturduğunuz için oldukça verimsizdir.
inspectorG4dget

@ inspectorG4dget, haklısınız, bu hızlı ve kirli - tek seferlik - bir çözüm.
Vic

Aslında, @ inspectorG4dget, kabul edilen yanıt aynı sorundan muzdarip değil mi?
Vic

2
line.replace(src,dst)değil. line[:10].replace(src,dst) + line[10:]yapar, ancak çok daha az ciddiyetle. Varsayalım line = ';'*12. Çözümünüz 12 kez yeni bir dizi oluşturacak. Kabul edilen çözüm bunu bir kez yapacaktır.
inspectorG4dget

3

Bu biraz daha genel bir durumu kapsamalıdır, ancak amacınız için özelleştirebilmelisiniz

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)

Bu yardımcı olur umarım


3

Dizedeki bir karaktere basitçe değer atayamazsınız. Belirli bir karakterin değerini değiştirmek için bu yöntemi kullanın:

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

Çıktı: In * ia

Ayrıca, ilk karakter dışında ilk karakterin tüm tekrarları için * deyimini değiştirmek isterseniz, örn. string = babble output = ba ** le

Kod:

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

1

Değişken 'n'de belirtilen bir dizin değeriyle değiştiriyorsanız, aşağıdakileri deneyin:

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

1
Bu çözümdeki sorun, n konumundaki karakterin tüm oluşumlarının yerini alması ve
soranın

Kesinlikle, kötü çözüm!
Erhard Dinhobl

1

Buna ne dersin:

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 () yöntemini ayrı bir liste oluşturmadan dize üzerinde etkili bir şekilde kullanmak için, örneğin bir dizi beyaz boşluk içeren dize içeren liste kullanıcı adına bir göz atın, beyaz boşluğu her bir kullanıcı adı dizesinde bir alt çizgi ile değiştirmek istiyoruz.

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

her kullanıcı adındaki beyaz boşlukları değiştirmek için python'daki range işlevini kullanmayı düşünün.

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

print(usernames)

0

Belirli bir dizindeki bir karakteri değiştirmek için işlev aşağıdaki gibidir:

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

burada s bir dizedir, n dizindir ve c bir karakterdir.


0

Bu yöntemi, belirli bir örnekte karakterleri veya dizeleri değiştirmek için yazdım. örnekler 0'dan başlar (isteğe bağlı örnek bağımsız değişkenini 1 ve test_instance değişkenini 1 olarak değiştirirseniz, bu kolayca 1 olarak değiştirilebilir.

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

Bunu yapabilirsiniz:

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

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

kullanıcı adları = []

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

o, p Joey_Tribbiani Monica_Geller Chandler_Bing Phoebe_Buffay


1
Teşekkürler, Muhammed Ben yeni başlayan biriyim, elimden geleni yapacağım.
Kasem007
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.