Entfernen Sie bestimmte Zeichen aus einer Zeichenfolge in Python

Lesezeit: 8 Minuten

Benutzer-Avatar
Matt Phillips

Ich versuche, bestimmte Zeichen mit Python aus einer Zeichenfolge zu entfernen. Dies ist der Code, den ich gerade verwende. Leider scheint es nichts mit der Saite zu tun.

for char in line:
    if char in " ?.!/;:":
        line.replace(char,'')

Wie mache ich das richtig?

  • Es ist über 5 Jahre her, aber wie wäre es mit der Verwendung der filter -Funktion und einen Lambda-Ausdruck: filter(lambda ch: ch not in " ?.!/;:", line). Ziemlich prägnant und auch effizient, denke ich. Natürlich gibt es einen neuen String zurück, dem Sie einen Namen zuweisen müssen.

    – Johannes Rot

    6. Februar 2016 um 10:35 Uhr

  • @JohnRed: Eigentlich gibt es einen Iterator zurück, der eine Liste von Zeichen zurückgibt, aber wenn Sie dies in eine Antwort aufnehmen würden, würden einige von uns gerne darüber stimmen.

    – Bill Glocke

    4. September 2017 um 20:43 Uhr

  • @BillBell: siehe stackoverflow.com/a/46930314/1587329 und stackoverflow.com/a/41413861/1587329

    – serv-inc

    25. Oktober 2017 um 10:46 Uhr

  • @BillBell: PS: Es ist ein Iterator in Python3 und eine Zeichenfolge, ein Tupel oder eine Liste in Python2

    – serv-inc

    25. Oktober 2017 um 10:55 Uhr

  • Verwandte: Warum bewirkt der Aufruf einer Python-String-Methode nichts, es sei denn, Sie weisen ihre Ausgabe zu?

    – Georgi

    31. Oktober 2019 um 14:21 Uhr

Benutzer-Avatar
intuitiv

Strings in Python sind unveränderlich (kann nicht geändert werden). Aus diesem Grund ist die Wirkung von line.replace(...) ist nur eine neue Zeichenfolge zu erstellen, anstatt die alte zu ändern. Du musst neu binden (zuordnen) zu line damit diese Variable den neuen Wert annimmt, wobei diese Zeichen entfernt werden.

Außerdem wird die Art und Weise, wie Sie es tun, relativ langsam sein. Es ist wahrscheinlich auch etwas verwirrend für erfahrene Pythoner, die eine doppelt verschachtelte Struktur sehen und für einen Moment denken, dass etwas Komplizierteres vor sich geht.

Ab Python 2.6 und neueren Versionen von Python 2.x * können Sie stattdessen verwenden str.translate(sehen Python 3-Antwort unter):

line = line.translate(None, '!@#$')

oder Ersatz regulärer Ausdrücke mit re.sub

import re
line = re.sub('[!@#$]', '', line)

Die in Klammern eingeschlossenen Zeichen bilden a Charakterklasse. Alle Zeichen in line die sich in dieser Klasse befinden, werden durch den zweiten Parameter to ersetzt sub: eine leere Zeichenfolge.

Python 3-Antwort

In Python 3 sind Strings Unicode. Du musst etwas anders übersetzen. kevpie erwähnt dies in einem Kommentar zu einer der Antworten, und es ist in der vermerkt Dokumentation für str.translate.

Beim Anrufen der translate -Methode einer Unicode-Zeichenfolge können Sie den zweiten Parameter, den wir oben verwendet haben, nicht übergeben. Sie können auch nicht passieren None als erster Parameter. Stattdessen übergeben Sie als einzigen Parameter eine Übersetzungstabelle (normalerweise ein Wörterbuch). Diese Tabelle bildet die ab Ordnungswerte von Zeichen (dh das Ergebnis des Aufrufs ord auf ihnen) zu den Ordinalwerten der Zeichen, die sie ersetzen sollen, oder – für uns nützlich –None um anzuzeigen, dass sie gelöscht werden sollen.

Um also den obigen Tanz mit einer Unicode-Zeichenfolge zu machen, würden Sie so etwas wie aufrufen

translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)

Hier dict.fromkeys und map werden verwendet, um ein Wörterbuch zu erstellen, das enthält

{ord('!'): None, ord('@'): None, ...}

Noch einfacher, wie eine andere Antwort es ausdrückt, erstellen Sie die Übersetzungstabelle an Ort und Stelle:

unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})

Oder erstellen Sie, wie von Joseph Lee erwähnt, dieselbe Übersetzungstabelle mit str.maketrans:

unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))

* Aus Gründen der Kompatibilität mit früheren Pythons können Sie eine “Null”-Übersetzungstabelle erstellen, die anstelle von übergeben wird None:

import string
line = line.translate(string.maketrans('', ''), '!@#$')

Hier string.maketrans wird verwendet, um eine zu erstellen Übersetzungstabelledie nur eine Zeichenfolge ist, die die Zeichen mit den Ordnungswerten 0 bis 255 enthält.

  • In Python3, line.translate nimmt nur ein Argument und die erste Lösung wird nicht funktionieren

    – Marczoide

    20. November 2012 um 9:19 Uhr

  • In Python3 übernimmt str.translate() nicht das 2. Argument. Ihre Antwort wird also line.translate({ord(i):None for i in '!@#$'})

    – Naveen

    12. Januar 2014 um 12:17 Uhr


  • Genauso wie jeder andere Charakter. In Python können Sie Paare aus einfachen oder doppelten Anführungszeichen verwenden. Also schreibst du einfach "'" für den Zeichensatz.

    – intuitiv

    26. November 2015 um 20:14 Uhr


  • Der obige Kommentar von @naveen hat bei mir funktioniert. Pythonie 2.7.13. In meinem Fall wollte ich ” und ‘ Zeichen entfernen: notes = notes.translate({ord(i):None for i in '\"\''})

    – RyanG

    14. März 2017 um 14:18 Uhr

  • In Python 3 können Sie verwenden unicode_line.translate(str.maketrans('', '', '!@#$')). Oder unicode_line.translate(dict.fromkeys(map(ord, '!@#$')))

    – Martijn Pieters

    8. April 2017 um 16:01 Uhr


Benutzer-Avatar
gsbabil

Verstehe ich hier den Punkt oder ist es nur folgendes:

string = "ab1cd1ef"
string = string.replace("1", "") 

print(string)
# result: "abcdef"

Legen Sie es in eine Schleife:

a = "a!b@c#d$"
b = "!@#$"
for char in b:
    a = a.replace(char, "")

print(a)
# result: "abcd"

  • Dadurch wird in jeder Schleife eine Kopie der Zeichenfolge erstellt, was möglicherweise nicht wünschenswert ist. Es ist auch kein sehr gutes Python. In Python würden Sie stattdessen so eine Schleife ausführen: for char in b: a=a.replace(char,"")

    – Elgehelge

    18. Oktober 2014 um 14:05 Uhr


  • Um effizienter zu sein, geben Sie alle Zeichen ein b in eine Menge, initialisieren Sie eine leere Liste und iterieren Sie dann a, wenn das aktuelle Zeichen nicht im Satz ist, füge es der Liste hinzu. Danach können Sie die Liste wieder in einen String umwandeln. Lineare Zeit und linearer (zusätzlicher) Raum.

    – Dönerkoffer

    21. Dezember 2020 um 4:49 Uhr

  • Sicher, das funktioniert, aber es hat eine Zeitkomplexität O, O(n^2) wobei n = len(string)

    – DonCarleone

    29. April 2021 um 21:44 Uhr


>>> line = "abc#@!?efg12;:?"
>>> ''.join( c for c in line if  c not in '?:!/;' )
'abc#@efg12'

  • Verwenden Sie ein anderes Zeichenfolgentrennzeichen wie ”’ oder “

    – ALisboa

    1. Juni 2017 um 20:00 Uhr

  • Wenn Sie viele verbotene Zeichen haben, können Sie Ihren Code beschleunigen, indem Sie ihn zuerst in einen Satz umwandeln. blacklist = set('?:!/;') und dann ''.join(c for c in line if c not in blacklist)

    – Boris Werchowskij

    16. Mai 2019 um 0:22 Uhr

Benutzer-Avatar
Serge Stroobandt

Mit re.sub regulären Ausdruck

Seit Python 3.5 Substitution mit regulären Ausdrücken re.sub verfügbar geworden:

import re
re.sub('\ |\?|\.|\!|\/|\;|\:', '', line)

Beispiel

import re
line="Q: Do I write ;/.??? No!!!"
re.sub('\ |\?|\.|\!|\/|\;|\:', '', line)

'QDoIwriteNo'

Erläuterung

Im Reguläre Ausdrücke (Regex), | ist ein logisches ODER und \ maskiert Leerzeichen und Sonderzeichen, die tatsächliche Regex-Befehle sein könnten. Wohingegen sub steht für Auswechslung, in diesem Fall mit dem leeren String ''.

Der Fragesteller hatte es fast. Wie bei den meisten Dingen in Python ist die Antwort einfacher als Sie denken.

>>> line = "H E?.LL!/;O:: "  
>>> for char in ' ?.!/;:':  
...  line = line.replace(char,'')  
...
>>> print line
HELLO

Sie müssen die Sache mit der verschachtelten if/for-Schleife nicht machen, aber Sie müssen jedes Zeichen einzeln überprüfen.

  • Ja, ich weiß, wahrscheinlich zu spät, aber sollte funktionieren, wenn Sie es entkommen. So: line = line.replace(””, ”) weiterlesen: Learnpythonthehardway.org/book/ex10.html

    – Aiyion.Prime

    26. August 2016 um 12:45 Uhr


  • Dies ist wahrscheinlich nicht leistungsfähig, da Sie jedem Zeichen eine neue Zeichenfolge zuweisen

    – OneCricketeer

    3. Dezember 2018 um 14:37 Uhr

Benutzer-Avatar
cod3monk3y

Für die umgekehrte Anforderung von nur erlauben bestimmte Charaktere In einer Zeichenfolge können Sie reguläre Ausdrücke mit einem Set-Komplement-Operator verwenden [^ABCabc]. Um beispielsweise alles außer ASCII-Buchstaben, Ziffern und dem Bindestrich zu entfernen:

>>> import string
>>> import re
>>>
>>> phrase="  There were "nine" (9) chick-peas in my pocket!!!      "
>>> allow = string.letters + string.digits + '-'
>>> re.sub('[^%s]' % allow, '', phrase)

'Therewerenine9chick-peasinmypocket'

Aus die Python-Dokumentation zu regulären Ausdrücken:

Zeichen, die nicht innerhalb eines Bereichs liegen, können durch Ergänzung des Satzes abgeglichen werden. Wenn das erste Zeichen des Satzes ist '^', werden alle Zeichen, die nicht im Satz enthalten sind, abgeglichen. Zum Beispiel, [^5] stimmt mit jedem Zeichen außer ‘5’ überein, und [^^] passt zu jedem Zeichen außer
'^'. ^ hat keine besondere Bedeutung, wenn es nicht das erste Zeichen in der Menge ist.

  • Ja, ich weiß, wahrscheinlich zu spät, aber sollte funktionieren, wenn Sie es entkommen. So: line = line.replace(””, ”) weiterlesen: Learnpythonthehardway.org/book/ex10.html

    – Aiyion.Prime

    26. August 2016 um 12:45 Uhr


  • Dies ist wahrscheinlich nicht leistungsfähig, da Sie jedem Zeichen eine neue Zeichenfolge zuweisen

    – OneCricketeer

    3. Dezember 2018 um 14:37 Uhr

Benutzer-Avatar
Muhammad Alkaruri

line = line.translate(None, " ?.!/;:")

1130410cookie-checkEntfernen Sie bestimmte Zeichen aus einer Zeichenfolge in Python

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy