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.

Die Unfun Cat
quelle
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.

Martijn Pieters
quelle
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
Dineshs91
quelle
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
nneonneo
quelle
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.

Vic
quelle
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

inspectorG4dget
quelle
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
Darshan Jain
quelle
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
Bipin Shetty
quelle
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)
N. Samuel
quelle
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')
Dylan Maulucci
quelle
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.

Sanket Hire
quelle
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
Matt Farguson
quelle
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)
Shabgard Tanha
quelle
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

Kasem007
quelle
1
Danke, Muhammad, ich bin ein Anfänger, ich werde mein Bestes geben.
Kasem007