Замена экземпляров символа в строке

120

Этот простой код, который просто пытается заменить точку с запятой (в 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

Как я могу обойти это, чтобы заменить точку с запятой двоеточием? Использование замены не работает, поскольку эта функция не принимает индекса - могут быть точки с запятой, которые я не хочу заменять.

пример

В строке может быть любое количество точек с запятой, например: «Привет, привет!;»

Я знаю, какие из них хочу заменить (у меня есть их индекс в строке). Использование замены не работает, поскольку я не могу использовать с ним индекс.

Несчастный Кот
источник
1
Вы знаете str.replace()BIF?
LarsVegas,
2
Да, как я объяснил в вопросе. Я также объяснил, почему у меня это не работает.
The Unfun Cat
Используйте str.find() вместо этого, чтобы найти позицию точки с запятой, затем используйте нарезку для извлечения подстроки.
LarsVegas
1
Тогда вам нужно уточнить, что считается действительной заменой; ваш нерабочий код заменил бы все точки с запятой в строке, если бы он был изменяемым.
Мартейн Питерс
1
@TheUnfunCat: Как вы вообще получаете индексы? Может быть лучшее решение для всего этого (например, регулярные выражения)
nneonneo

Ответы:

207

Строки в Python неизменяемы, поэтому вы не можете рассматривать их как список и назначать индексы.

.replace()Вместо этого используйте :

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

Если вам нужно заменить только определенные точки с запятой, вы должны быть более конкретными. Вы можете использовать нарезку, чтобы изолировать часть строки, которую нужно заменить:

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

Это заменит все точки с запятой в первых 10 символах строки.

Мартейн Питерс
источник
Это работает с символами юникода? Похоже, у меня это не работает.
Steven2163712
@ Steven2163712: Весь текст в Юникоде, так что да, он отлично работает со всеми символами. Без конкретного примера я не могу помочь вам решить вашу конкретную проблему.
Мартейн Питерс
62

Вы можете сделать следующее, чтобы заменить любой символ на соответствующий символ по заданному индексу, если вы не хотите использовать .replace()

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

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

o/p: pythin
Динеш91
источник
7
Это должен быть принятый ответ, непосредственно отвечающий на вопрос. Это самый простой способ, который я нашел до сих пор.
Flare Cat
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
nneonneo
источник
6

Если вы хотите заменить одну точку с запятой:

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

Но не тестировал.

Вик
источник
3
Это будет работать (+1), но довольно неэффективно, поскольку вы создаете новую строку каждый раз, когда встречаетесь с символом ';'
InspectorG4dget
@ InspectorG4dget, вы правы, это быстрое и грязное - одноразовое - решение.
Вик
Собственно, @ InspectorG4dget, разве принятый ответ не страдает той же проблемой?
Вик
2
line.replace(src,dst)не. line[:10].replace(src,dst) + line[10:]делает, но с гораздо меньшей серьезностью. Предположим line = ';'*12. Ваше решение построит новую строку 12 раз. Принятое решение сделает это один раз.
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)

Надеюсь это поможет

inspectorG4dget
источник
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, и запрашивающий хочет заменить только это конкретное вхождение
shivram.ss 02
Собственно, плохое решение!
Эрхард Динхобл 05
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.

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 - символ.

Sanket Hire
источник
0

Я написал этот метод для замены символов или замены строк в определенном экземпляре. экземпляры начинаются с 0 (это можно легко изменить на 1, если вы измените необязательный аргумент inst на 1, а переменную test_instance на 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

names = ["Джои Триббиани", "Моника Геллер", "Чендлер Бинг", "Фиби Буффей"]

имена пользователей = []

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

o, p Joey_Tribbiani Monica_Geller Chandler_Bing Phoebe_Buffay

Kasem007
источник
1
Спасибо, Мухаммад. Я новичок, сделаю все возможное.
Kasem007,