So löschen Sie ein Zeichen mit Python aus einer Zeichenfolge

457

Es gibt zum Beispiel eine Zeichenfolge. EXAMPLE.

Wie kann ich das mittlere Zeichen entfernen, dh daraus entfernen M? Ich brauche den Code nicht. Ich möchte es wissen:

  • Beenden Zeichenfolgen in Python mit einem Sonderzeichen?
  • Was ist ein besserer Weg - alles von rechts nach links zu verschieben, beginnend mit dem mittleren Zeichen ODER der Erstellung einer neuen Zeichenfolge und nicht das Kopieren des mittleren Zeichens?
Laser
quelle

Antworten:

639

In Python sind Zeichenfolgen unveränderlich, daher müssen Sie eine neue Zeichenfolge erstellen. Sie haben einige Möglichkeiten, wie Sie die neue Zeichenfolge erstellen können. Wenn Sie das 'M' entfernen möchten, wo immer es erscheint:

newstr = oldstr.replace("M", "")

Wenn Sie das zentrale Zeichen entfernen möchten:

midlen = len(oldstr)/2   # //2 in python 3
newstr = oldstr[:midlen] + oldstr[midlen+1:]

Sie haben gefragt, ob Zeichenfolgen mit einem Sonderzeichen enden. Nein, Sie denken wie ein C-Programmierer. In Python werden Zeichenfolgen mit ihrer Länge gespeichert, sodass jeder Bytewert, einschließlich \0, in einer Zeichenfolge angezeigt werden kann.

Ned Batchelder
quelle
16
Da der Fragesteller für Python brandneu ist, ist es möglicherweise erwähnenswert, dass in Version 2.X Python der Operator "/" eine Ganzzahl (gegen Null abgeschnitten) zurückgibt. In Version 3.X sollten Sie "//" verwenden. stattdessen. Außerdem wird die Zeile from __future__ import divisionam Anfang Ihres Skripts Python der Version 2.X wie Version 3.X verhalten
Michael Dunn
1
Beachten Sie, dass, wenn "M" der einzige Inhalt der Zeile ist, "" an seiner Stelle eine leere Zeile zurückbleibt.
8bitjunkie
1
@ 7SpecialGems es hängt ganz davon ab, was Sie mit dieser Zeichenfolge machen. Eine leere Zeichenfolge wie ""impliziert keine leere Zeile. Wenn Sie es in eine Liste einfügen und mit Zeilenumbrüchen verbinden, wird eine leere Zeile erstellt, aber es gibt viele andere Stellen, an denen Sie möglicherweise eine leere Zeichenfolge verwenden, die dies nicht tut.
Ned Batchelder
68

Dies ist wahrscheinlich der beste Weg:

original = "EXAMPLE"
removed = original.replace("M", "")

Mach dir keine Sorgen über das Verschieben von Charakteren und so. Der meiste Python-Code findet auf einer viel höheren Abstraktionsebene statt.

rekursiv
quelle
6
Mist möglicherweise nicht eindeutig. In diesem Fall werden dadurch alle Ms ersetzt, oder?
Lazer
14
Ja das ist richtig. Wenn Sie nur nVorkommen ersetzen möchten , verwenden Sie original.replace("M", "", n).
rekursiv
1
@ S.Lott Ich nahm das als rhetorisch, um vorzuschlagen, die Lösung
bereitzustellen
63

So ersetzen Sie eine bestimmte Position:

s = s[:pos] + s[(pos+1):]

So ersetzen Sie ein bestimmtes Zeichen:

s = s.replace('M','')
Eton B.
quelle
18
Dies mag zwar funktionieren, aber ich denke, Ihre Antwort könnte verbessert werden, indem Sie erklären, was im ersten Teil vor sich geht, da die Teilzeichenfolgenoperationen für einen Python-Neuling ohne Erklärung nicht unbedingt leicht zu verstehen sind.
Jloubert
Also wenn die Länge von s ist l. Dann sollte für den ersten Teil die Einschränkung für pos sein l-1 > pos >= 0.
Haoyu Chen
s [: pos] erhält Teilzeichenfolge von 0 bis pos-1 und s [(pos + 1):] erhält Teilzeichenfolge von pos + 1 bis zum Ende. Daher wird s [pos] von s entfernt.
Uhr
es ersetzt nicht, es fällt. Es ist gut, die Operation zu unterscheiden, indem Beispiele für beide der beiden Hauptanwendungsfälle bereitgestellt werden, die durch ihre Positionsauswahlmethode getrennt sind.
Alexander Stohr
28

Saiten sind unveränderlich. Sie können sie jedoch in eine veränderbare Liste konvertieren und die Liste nach dem Ändern wieder in eine Zeichenfolge konvertieren.

s = "this is a string"

l = list(s)  # convert to list

l[1] = ""    # "delete" letter h (the item actually still exists but is empty)
l[1:2] = []  # really delete letter h (the item is actually removed from the list)
del(l[1])    # another way to delete it

p = l.index("a")  # find position of the letter "a"
del(l[p])         # delete it

s = "".join(l)  # convert back to string

Sie können auch eine neue Zeichenfolge erstellen, wie andere gezeigt haben, indem Sie alles außer dem gewünschten Zeichen aus der vorhandenen Zeichenfolge übernehmen.

irgendwie
quelle
4
Warum würden Sie nicht einfach die str.replaceMethode anwenden?
Alichaudry
12

Wie kann ich das mittlere Zeichen, dh M, entfernen?

Sie können nicht, weil Zeichenfolgen in Python unveränderlich sind .

Beenden Zeichenfolgen in Python mit einem Sonderzeichen?

Nein. Sie ähneln Listen von Zeichen. Die Länge der Liste definiert die Länge der Zeichenfolge, und kein Zeichen fungiert als Abschlusszeichen.

Was ist ein besserer Weg - alles von rechts nach links zu verschieben, beginnend mit dem mittleren Zeichen ODER der Erstellung einer neuen Zeichenfolge und nicht das Kopieren des mittleren Zeichens?

Sie können die vorhandene Zeichenfolge nicht ändern, daher müssen Sie eine neue erstellen, die alles außer dem mittleren Zeichen enthält.

Richard Fearn
quelle
11

Verwenden Sie die translate()Methode:

>>> s = 'EXAMPLE'
>>> s.translate(None, 'M')
'EXAPLE'
Stefan van den Akker
quelle
3
Die Methode hat sich geändert. Siehe die Dokumente für Python 3: translate () Dies ersetzt verschiedene Zeichen durch Leerzeichen ( Nonezu entfernen scheint nicht zu funktionieren):translate( str.maketrans("<>", " ") )
behandeln
1
Tatsächlich geben die Dokumente zwei Möglichkeiten an, um verschiedene Zeichen mit translate () in Python 3 zu entfernen: str.maketrans( "", "", "<>")undstr.maketrans( {"<":None,">":None })
behandeln
3
Das Äquivalent des Codes in der Antwort wurde dies in Python3:'EXAMPLE'.translate({ord("M"): None})
YoniLavi
7

UserString.MutableString

Veränderlicher Weg:

import UserString

s = UserString.MutableString("EXAMPLE")

>>> type(s)
<type 'str'>

# Delete 'M'
del s[3]

# Turn it for immutable:
s = str(s)
Killown
quelle
3
404 Website kein Import
somethingSomething
6
card = random.choice(cards)
cardsLeft = cards.replace(card, '', 1)

So entfernen Sie ein Zeichen aus einer Zeichenfolge: In diesem Beispiel wird ein Kartenstapel als Zeichen in einer Zeichenfolge dargestellt. Eine davon wird gezeichnet (Zufallsmodul für die Funktion random.choice () importieren, die ein zufälliges Zeichen in der Zeichenfolge auswählt). Eine neue Zeichenfolge, cardLeft, wird erstellt, um die verbleibenden Karten der Zeichenfolgenfunktion replace () aufzunehmen, wobei der letzte Parameter angibt, dass nur eine "Karte" durch die leere Zeichenfolge ersetzt werden soll ...

StaffanRolfsson
quelle
6
def kill_char(string, n): # n = position of which character you want to remove
    begin = string[:n]    # from beginning to n (n not included)
    end = string[n+1:]    # n+1 through end of string
    return begin + end
print kill_char("EXAMPLE", 3)  # "M" removed

Ich habe das irgendwo hier gesehen .

user1443297
quelle
4

Folgendes habe ich getan, um das "M" herauszuschneiden:

s = 'EXAMPLE'
s1 = s[:s.index('M')] + s[s.index('M')+1:]
PaulM
quelle
2
Dies würde nur für diese bestimmte Zeichenfolge funktionieren und ist keine allgemeine Lösung.
Andreas Bergström
3

Wenn Sie Zeichen in einer Zeichenfolge löschen / ignorieren möchten und beispielsweise diese Zeichenfolge haben,

[11: L: 0]

Nehmen wir an, Sie verwenden Anforderungen aus einer Web-API-Antwort oder ähnlichem, z. B. einer CSV-Datei

import requests
udid = 123456
url = 'http://webservices.yourserver.com/action/id-' + udid
s = requests.Session()
s.verify = False
resp = s.get(url, stream=True)
content = resp.content

Schleife und entfernen Sie unerwünschte Zeichen:

for line in resp.iter_lines():
  line = line.replace("[", "")
  line = line.replace("]", "")
  line = line.replace('"', "")

Optionale Aufteilung, und Sie können die Werte einzeln lesen:

listofvalues = line.split(':')

Jetzt ist der Zugriff auf jeden Wert einfacher:

print listofvalues[0]
print listofvalues[1]
print listofvalues[2]

Dies wird gedruckt

11

L.

0

d1jhoni1b
quelle
3

So löschen Sie ein charoder ein sub-string einmaliges (nur das erste Vorkommen):

main_string = main_string.replace(sub_str, replace_with, 1)

HINWEIS: Hier 1kann intfür die Anzahl der Vorkommen, die Sie ersetzen möchten, eine beliebige ersetzt werden.

BlackBeard
quelle
3

Sie können einfach das Listenverständnis verwenden.

Angenommen, Sie haben die Zeichenfolge: my name isund möchten das Zeichen entfernen m. Verwenden Sie den folgenden Code:

"".join([x for x in "my name is" if x is not 'm'])
hubert
quelle
0
from random import randint


def shuffle_word(word):
    newWord=""
    for i in range(0,len(word)):
        pos=randint(0,len(word)-1)
        newWord += word[pos]
        word = word[:pos]+word[pos+1:]
    return newWord

word = "Sarajevo"
print(shuffle_word(word))
Fahrudin Halilović
quelle
2
Während dieses Code-Snippet die Frage lösen kann, hilft eine Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
Andreas
0

Ein anderer Weg ist mit einer Funktion,

Im Folgenden finden Sie eine Möglichkeit, alle Vokale aus einer Zeichenfolge zu entfernen, indem Sie einfach die Funktion aufrufen

def disemvowel(s):
    return s.translate(None, "aeiouAEIOU")
Kyoujin
quelle
-7

Strings sind in Python unveränderlich, sodass beide Optionen im Grunde dasselbe bedeuten.

Skilldrick
quelle