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


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.