Mengganti contoh karakter dalam string

120

Kode sederhana ini yang mencoba mengganti titik koma (pada posisi yang ditentukan-i) dengan titik dua tidak berfungsi:

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

Ini memberikan kesalahan

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

Bagaimana cara mengatasi ini untuk mengganti titik koma dengan titik dua? Menggunakan ganti tidak berfungsi karena fungsi itu tidak membutuhkan indeks- mungkin ada beberapa titik koma yang tidak ingin saya ganti.

Contoh

Dalam string saya mungkin memiliki beberapa titik koma, misalnya "Hei der!; Halo yang di sana;!;"

Saya tahu mana yang ingin saya ganti (saya memiliki indeksnya dalam string). Menggunakan replace tidak berfungsi karena saya tidak dapat menggunakan indeks dengannya.

Kucing Unfun
sumber
1
Apakah Anda tahu str.replace()BIF?
LarsVegas
2
Ya, seperti yang saya jelaskan di pertanyaan. Saya juga menjelaskan mengapa itu tidak berhasil untuk saya.
The Unfun Cat
Gunakan str.find() untuk mencari posisi titik koma, lalu gunakan pemotongan untuk mengekstrak substring.
LarsVegas
1
Anda harus lebih spesifik dalam hal apa yang merupakan pengganti yang valid; kode non-kerja Anda akan mengganti semua titik koma dalam string jika bisa berubah.
Martijn Pieters
1
@TheUnfunCat: Bagaimana Anda mendapatkan indeks pada awalnya? Mungkin ada solusi yang lebih baik untuk semuanya (misalnya
regex

Jawaban:

207

String dalam python tidak dapat diubah, jadi Anda tidak dapat memperlakukannya sebagai daftar dan ditetapkan ke indeks.

Gunakan .replace()sebagai gantinya:

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

Jika Anda hanya perlu mengganti titik koma tertentu , Anda harus lebih spesifik. Anda dapat menggunakan slicing untuk mengisolasi bagian string yang akan diganti:

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

Itu akan menggantikan semua titik koma dalam 10 karakter pertama string.

Martijn Pieters
sumber
Apakah ini berfungsi dengan karakter unicode? Sepertinya tidak berhasil untuk saya.
Steven2163712
@ Steven2163712: Semua teks adalah Unicode, jadi ya, ini berfungsi dengan baik dengan semua karakter. Tanpa contoh konkret, saya tidak dapat membantu Anda memperbaiki masalah spesifik Anda.
Martijn Pieters
62

Anda dapat melakukan hal di bawah ini, untuk mengganti karakter apapun dengan karakter masing-masing pada indeks tertentu, jika Anda tidak ingin menggunakannya .replace()

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

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

o/p: pythin
Dineshs91
sumber
7
Ini harus menjadi jawaban yang diterima, langsung menjawab pertanyaan itu. Ini adalah metode termudah yang saya temukan sejauh ini.
Flare Cat
24

Ubah string menjadi daftar; lalu Anda dapat mengubah karakter satu per satu. Kemudian Anda dapat menyatukannya kembali dengan .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
nneonneo
sumber
6

Jika Anda ingin mengganti satu titik koma:

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

Aku pernah mencobanya.

Vic
sumber
3
Ini akan bekerja (+1), tetapi cukup tidak efisien, karena Anda membuat string baru setiap kali Anda menemukan ';'
inspectorG4dget
@ inspectorG4dget, Anda benar, ini solusi yang cepat dan kotor - hanya satu kali.
Vic
Sebenarnya, @ inspectorG4dget, bukankah jawaban yang diterima mengalami masalah yang sama?
Vic
2
line.replace(src,dst)tidak. line[:10].replace(src,dst) + line[10:]tidak, tetapi dengan tingkat keparahan yang jauh lebih kecil. Misalkan line = ';'*12. Solusi Anda akan membuat string baru 12 kali. Solusi yang diterima akan melakukannya sekali.
inspectorG4dget
3

Ini harus mencakup kasus yang sedikit lebih umum, tetapi Anda harus dapat menyesuaikannya untuk tujuan Anda

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)

Semoga ini membantu

inspectorG4dget
sumber
3

Anda tidak bisa begitu saja menetapkan nilai ke karakter dalam string. Gunakan metode ini untuk mengganti nilai karakter tertentu:

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

Keluaran: Dalam * ia

Juga, jika Anda ingin mengganti say * untuk semua kemunculan karakter pertama kecuali karakter pertama, mis. string = keluaran babble = ba ** le

Kode:

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

Jika Anda mengganti dengan nilai indeks yang ditentukan dalam variabel 'n', coba yang berikut ini:

def missing_char(str, n):
 str=str.replace(str[n],":")
 return str
Bipin Shetty
sumber
1
Masalah dengan solusi ini adalah itu akan mengganti semua kemunculan karakter pada posisi n dan penanya hanya ingin mengganti kejadian spesifik itu
shivram.ss
Tepat sekali, solusi yang buruk!
Erhard Dinhobl
1

Bagaimana dengan ini:

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')
Dylan Maulucci
sumber
1

untuk menggunakan metode .replace () secara efektif pada string tanpa membuat daftar terpisah misalnya lihat daftar nama pengguna yang berisi string dengan beberapa spasi, kami ingin mengganti spasi putih dengan garis bawah di setiap string nama pengguna.

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

untuk mengganti spasi di setiap nama pengguna, pertimbangkan untuk menggunakan fungsi range di python.

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

print(usernames)
N. Samuel
sumber
0

Untuk mengganti karakter pada indeks tertentu, fungsinya adalah sebagai berikut:

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

dimana s adalah string, n adalah indeks dan c adalah karakter.

Penyewaan Sanket
sumber
0

Saya menulis metode ini untuk mengganti karakter atau mengganti string pada contoh tertentu. instance dimulai dari 0 (ini dapat dengan mudah diubah menjadi 1 jika Anda mengubah argumen inst opsional menjadi 1, dan variabel test_instance menjadi 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
Matt Farguson
sumber
0

Kamu bisa melakukan ini:

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)
shabgard tanha
sumber
0

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

nama pengguna = []

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

o, p Joey_Tribbiani Monica_Geller Chandler_Bing Phoebe_Buffay

Kasem007
sumber
1
Terima kasih, Muhammad. Saya seorang pemula. Saya akan melakukan yang terbaik.
Kasem007