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


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

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

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)

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


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


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


1
Спасибо, Мухаммад. Я новичок, сделаю все возможное.
— Kasem007,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.