Ersetzen von Instanzen eines Zeichens in einer Zeichenfolge


118

Dieser einfache Code, der einfach versucht, Semikolons (an i-angegebenen Positionen) durch Doppelpunkte zu ersetzen, funktioniert nicht:

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

Es gibt den Fehler

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

Wie kann ich das umgehen, um die Semikolons durch Doppelpunkte zu ersetzen? Die Verwendung von replace funktioniert nicht, da diese Funktion keinen Index benötigt. Möglicherweise gibt es einige Semikolons, die ich nicht ersetzen möchte.

Beispiel

In der Zeichenfolge kann ich eine beliebige Anzahl von Semikolons haben, z. B. "Hei der !; Hallo ;;;"

Ich weiß, welche ich ersetzen möchte (ich habe ihren Index in der Zeichenfolge). Die Verwendung von "Ersetzen" funktioniert nicht, da ich keinen Index damit verwenden kann.


1
Kennst du das str.replace()BIF?
LarsVegas

2
Ja, wie ich in der Frage erklärt habe. Ich erklärte auch, warum das bei mir nicht funktioniert.
Die Unfun Cat

Verwenden Sie str.find() stattdessen, um die Position des Semikolons zu ermitteln, und extrahieren Sie dann den Teilstring in Scheiben.
LarsVegas

1
Sie müssen dann genauer angeben, was einen gültigen Ersatz darstellt. Ihr nicht funktionierender Code würde alle Semikolons in der Zeichenfolge ersetzen, wenn er veränderbar wäre.
Martijn Pieters

1
@TheUnfunCat: Wie bekommen Sie die Indizes überhaupt? Es könnte eine bessere Lösung für das Ganze geben (z. B. Regexes)
nneonneo

Antworten:


206

Zeichenfolgen in Python sind unveränderlich, sodass Sie sie nicht als Liste behandeln und Indizes zuweisen können.

Verwenden Sie .replace()stattdessen:

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

Wenn Sie nur bestimmte Semikolons ersetzen müssen, müssen Sie genauer sein. Sie können Slicing verwenden, um den Abschnitt der Zeichenfolge zu isolieren, der ersetzt werden soll in:

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

Dadurch werden alle Semikolons in den ersten 10 Zeichen der Zeichenfolge ersetzt.


Funktioniert dies mit Unicode-Zeichen? Es scheint bei mir nicht zu funktionieren.
Steven2163712

@ Steven2163712: Der gesamte Text ist Unicode, also ja, das funktioniert gut mit allen Zeichen. Ohne ein konkretes Beispiel kann ich Ihnen nicht helfen, Ihr spezifisches Problem zu beheben.
Martijn Pieters

61

Sie können Folgendes tun, um ein Zeichen durch ein entsprechendes Zeichen an einem bestimmten Index zu ersetzen, wenn Sie es nicht verwenden möchten .replace()

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

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

o/p: pythin

7
Dies sollte die akzeptierte Antwort sein, beantwortet direkt die Frage. Dies ist die einfachste Methode, die ich bisher gefunden habe.
Flare Cat

24

Verwandeln Sie die Zeichenfolge in eine Liste. dann können Sie die Zeichen einzeln ändern. Dann können Sie es wieder zusammensetzen mit .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

Wenn Sie ein einzelnes Semikolon ersetzen möchten:

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

Havent hat es allerdings getestet.


3
Dies funktioniert (+1), ist jedoch ziemlich ineffizient, da Sie jedes Mal, wenn Sie auf ein ';'
InspectorG4dget

@ inspectorG4dget, Sie haben Recht, es ist eine schnelle und schmutzige - nur einmalige - Lösung.
Vic

@ InspectorG4dget, leidet die akzeptierte Antwort nicht unter demselben Problem?
Vic

2
line.replace(src,dst)nicht. line[:10].replace(src,dst) + line[10:]tut, aber in viel weniger Schwere. Angenommen, wir nehmen an line = ';'*12. Ihre Lösung erstellt 12 Mal eine neue Zeichenfolge. Die akzeptierte Lösung wird dies einmal tun.
InspectorG4dget

3

Dies sollte einen etwas allgemeineren Fall abdecken, aber Sie sollten in der Lage sein, ihn für Ihren Zweck anzupassen

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)

Hoffe das hilft


3

Sie können einem Zeichen in der Zeichenfolge nicht einfach einen Wert zuweisen. Verwenden Sie diese Methode, um den Wert eines bestimmten Zeichens zu ersetzen:

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

Ausgabe: In * ia

Wenn Sie say * für alle Vorkommen des ersten Zeichens mit Ausnahme des ersten Zeichens ersetzen möchten, z. string = babble output = ba ** le

Code:

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

1

Wenn Sie durch einen in der Variablen 'n' angegebenen Indexwert ersetzen, versuchen Sie Folgendes:

def missing_char(str, n):
 str=str.replace(str[n],":")
 return str

1
Das Problem bei dieser Lösung ist, dass alle Vorkommen des Zeichens an Position n ersetzt werden und der Fragesteller nur dieses bestimmte Vorkommen ersetzen möchte
shivram.ss

Genau, schlechte Lösung!
Erhard Dinhobl

1

Um die .replace () -Methode effektiv für Zeichenfolgen zu verwenden, ohne eine separate Liste zu erstellen, werfen Sie beispielsweise einen Blick auf den Listenbenutzernamen, der eine Zeichenfolge mit einem Leerzeichen enthält. Wir möchten den Leerraum durch einen Unterstrich in jeder Zeichenfolge des Benutzernamens ersetzen.

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

Um die Leerzeichen in jedem Benutzernamen zu ersetzen, sollten Sie die Bereichsfunktion in Python verwenden.

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

print(usernames)

0

Wie wäre es damit:

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')

0

Um ein Zeichen an einem bestimmten Index zu ersetzen, lautet die Funktion wie folgt:

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

Dabei ist s eine Zeichenfolge, n ein Index und c ein Zeichen.


0

Ich habe diese Methode geschrieben, um Zeichen oder Zeichenfolgen an einer bestimmten Instanz zu ersetzen. Instanzen beginnen bei 0 (dies kann leicht in 1 geändert werden, wenn Sie das optionale Argument inst in 1 und die Variable test_instance in 1 ändern.

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

Du kannst das:

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 = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

Benutzernamen = []

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

o, p Joey_Tribbiani Monica_Geller Chandler_Bing Phoebe_Buffay


1
Danke, Muhammad, ich bin ein Anfänger, ich werde mein Bestes geben.
Kasem007
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.