Заміна екземплярів символу в рядку


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

Як я можу зробити це, щоб замінити крапки з комою на крапки? Використання заміни не працює, оскільки ця функція не бере індексу - можуть бути деякі крапки з комою, які я не хочу замінювати.

Приклад

У рядку я можу мати будь-яку кількість крапки з комою, напр. "Hei der!

Я знаю, які я хочу замінити (у мене є їх індекс у рядку). Використання заміни не працює, оскільки я не в змозі використовувати з ним індекс.


1
Ви знаєте str.replace()BIF?
LarsVegas

2
Так, як я пояснив у питанні. Я також пояснив, чому це не працює для мене.
The Unfun Cat

Використовуйте str.find() натомість, щоб знайти позицію крапки з комою, а потім витягніть підрядок.
LarsVegas

1
Ви повинні бути більш конкретними в тому, що є дійсною заміною; ваш непрацюючий код замінив би всі крапки з комою в рядку, якби він був змінним.
Martijn Pieters

1
@TheUnfunCat: Як ви в першу чергу отримуєте індекси? Можливо, буде краще рішення для всієї справи (наприклад, регулярних
виразів

Відповіді:


207

Рядки в python незмінні, тому ви не можете розглядати їх як список та призначати до індексів.

Використовуйте .replace()замість цього:

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

Якщо вам потрібно замінити лише певні крапки з комою, вам потрібно буде бути більш конкретними. Ви можете використовувати нарізку для ізоляції ділянки рядка для заміни на:

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

Це замінить усі напівколонки в перших 10 символах рядка.


Це працює з символами unicode? Здається, це не працює для мене.
Steven2163712

@ Steven2163712: Весь текст є Unicode, так що так, це добре працює з усіма символами. Без конкретного прикладу я не можу допомогти вам вирішити вашу конкретну проблему.
Martijn Pieters

62

Ви можете зробити нижче, щоб замінити будь-яке char відповідним символом у заданому індексі, якщо ви не хочете використовувати його .replace()

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

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

o/p: pythin

7
Це має бути прийнята відповідь, безпосередньо відповідає на питання. Це найпростіший метод, який я знайшов поки що.
Спалах кота

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

Крім того, якщо ви хочете замінити слово * для всіх випадків першого символу, крім першого символу, наприклад. рядок = бабл вихід = ба ** ле

Код:

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, і
запитувач

Точно, бідне рішення!
Ерхард Дінгобл

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_in substance на 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

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

ім’я користувачів = []

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.