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 Zeichenfolge zu tun zu haben.
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
Wie mache ich das richtig?
python
string
immutability
Matt Phillips
quelle
quelle
filter
Funktion und einem Lambda-Ausdruck :filter(lambda ch: ch not in " ?.!/;:", line)
. Ziemlich prägnant und effizient, denke ich. Natürlich wird eine neue Zeichenfolge zurückgegeben, der Sie einen Namen zuweisen müssen.Antworten:
Zeichenfolgen in Python sind unveränderlich (können nicht geändert werden). Aus diesem Grund
line.replace(...)
wird nur eine neue Zeichenfolge erstellt, anstatt die alte zu ändern. Sie müssen es erneut binden (zuweisen)line
, damit diese Variable den neuen Wert annimmt und 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 Pythonatoren, die eine doppelt verschachtelte Struktur sehen und für einen Moment denken, dass etwas Komplizierteres vor sich geht.
Ab Python 2.6 und neueren Python 2.x-Versionen * können Sie stattdessen Folgendes verwenden
str.translate
(lesen Sie jedoch weiter für Python 3-Unterschiede):oder Ersatz für reguläre Ausdrücke durch
re.sub
Die in Klammern eingeschlossenen Zeichen bilden eine Zeichenklasse . Alle Zeichen in
line
dieser Klasse werden durch den zweiten Parameter ersetztsub
: eine leere Zeichenfolge.In Python 3 sind Zeichenfolgen Unicode. Sie müssen etwas anders übersetzen. kevpie erwähnt dies in einem Kommentar zu einer der Antworten und ist in der Dokumentation für
str.translate
vermerkt .Wenn Sie die
translate
Methode einer Unicode-Zeichenfolge aufrufen , können Sie den oben verwendeten zweiten Parameter nicht übergeben. Sie können auch nichtNone
als ersten Parameter übergeben. Stattdessen übergeben Sie eine Übersetzungstabelle (normalerweise ein Wörterbuch) als einzigen Parameter. Diese Tabelle bildet die Ordnungswerte von Zeichen ab (dh das Ergebnis des Aufrufsord
) den Ordnungswerten der Zeichen zu, die sie ersetzen sollen, oder - für uns nützlich - um anzuzeigenNone
, dass sie gelöscht werden sollen.Um den obigen Tanz mit einer Unicode-Saite zu machen, würde man so etwas nennen
Hier
dict.fromkeys
undmap
werden verwendet, um kurz und bündig ein Wörterbuch zu generieren, das enthältNoch einfacher, wie eine andere Antwort sagt , erstellen Sie die Übersetzungstabelle an Ort und Stelle:
Oder erstellen Sie dieselbe Übersetzungstabelle mit
str.maketrans
:* Aus Gründen der Kompatibilität mit früheren Pythons können Sie eine "Null" -Übersetzungstabelle erstellen, die anstelle von
None
:Hier
string.maketrans
wird eine Übersetzungstabelle erstellt , bei der es sich lediglich um eine Zeichenfolge handelt, die Zeichen mit den Ordnungswerten 0 bis 255 enthält.quelle
line.translate
nur ein Argument verwendet und die erste Lösung wird nicht funktionierenline.translate({ord(i):None for i in '!@#$'})
"'"
für den Zeichensatz.notes = notes.translate({ord(i):None for i in '\"\''})
unicode_line.translate(str.maketrans('', '', '!@#$'))
. Oderunicode_line.translate(dict.fromkeys(map(ord, '!@#$')))
Fehlt mir hier der Punkt oder ist es nur der folgende:
Setzen Sie es in eine Schleife:
quelle
for char in b: a=a.replace(char,"")
string=string.replace("1","")
stattdessen sein. Sie haben dies in der Schleife Ihres Beispiels gesagt, aber die meisten Leute werden nicht so weit in Ihre Antwort hineinlesen, bis sie zuerst mit dem Code herumgespielt haben, um eine so einfache Frage zu beantworten.quelle
blacklist = set('?:!/;')
und dann''.join(c for c in line if c not in blacklist)
Einfach peasy mit
re.sub
regulärem Ausdruck ab Python 3.5Beispiel
Erläuterung
In regulären Ausdrücken (Regex)
|
ist dies ein logisches ODER und es werden\
Leerzeichen und Sonderzeichen ausgeblendet, bei denen es sich möglicherweise um tatsächliche Regex-Befehle handelt. Währendsub
für Substitution steht , in diesem Fall mit der leeren Zeichenfolge''
.quelle
Für die umgekehrte Anforderung, nur bestimmte Zeichen in einer Zeichenfolge zuzulassen , können Sie reguläre Ausdrücke mit einem Satzkomplementoperator verwenden
[^ABCabc]
. So entfernen Sie beispielsweise alles außer ASCII-Buchstaben, Ziffern und dem Bindestrich:Aus der Python-Dokumentation für reguläre Ausdrücke :
quelle
Der Fragesteller hatte es fast geschafft. Wie die meisten Dinge in Python ist die Antwort einfacher als Sie denken.
Sie müssen die verschachtelte if / for-Schleife nicht ausführen, aber Sie müssen jedes Zeichen einzeln überprüfen.
quelle
quelle
quelle
Zeichenfolgen sind in Python unveränderlich. Die
replace
Methode gibt nach dem Ersetzen eine neue Zeichenfolge zurück. Versuchen:quelle
line
.Ich war überrascht, dass noch niemand empfohlen hatte, die eingebaute Filterfunktion zu verwenden.
Angenommen, wir möchten alles herausfiltern, was keine Zahl ist. Verwenden der integrierten Filtermethode "... entspricht dem Generatorausdruck (Element für Element in iterierbarer Funktion (Element))" [ Python 3 Builtins: Filter ]
In Python 3 kehrt dies zurück
Um eine gedruckte Zeichenfolge zu erhalten,
Ich bin mir nicht sicher, wie Filter in Bezug auf Effizienz eingestuft werden, aber es ist eine gute Sache zu wissen, wie man sie verwendet, wenn man Listenverständnisse und dergleichen durchführt.
AKTUALISIEREN
Da Filter funktioniert, können Sie logischerweise auch das Listenverständnis verwenden, und nach dem, was ich gelesen habe, soll es effizienter sein, da Lambdas die Wall Street Hedge Fund-Manager der Programmierfunktionswelt sind. Ein weiteres Plus ist, dass es sich um einen Einzeiler handelt, für den keine Importe erforderlich sind. Verwenden Sie beispielsweise die oben definierten Zeichenfolgen.
Das ist es. Die Rückgabe ist eine Zeichenfolge aller Zeichen, die Ziffern in der ursprünglichen Zeichenfolge sind.
Wenn Sie eine bestimmte Liste akzeptabler / nicht akzeptabler Zeichen haben, müssen Sie nur den 'if'-Teil des Listenverständnisses anpassen.
oder alternativ,
quelle
operator.contains
wenn Sielambda
sowieso verwenden.lambda x: operator.contains(intsList, x)
sollte geschrieben werdenlambda x: x in intsList
, oder wenn Sie versuchen, die C-Level-Prüfung zu bekommen, wirdintsList.__contains__
(überhaupt nichtlambda
) den Trick tun.Mit
filter
benötigen Sie nur eine ZeileDies behandelt die Zeichenfolge als iterierbar und überprüft jedes Zeichen, wenn
lambda
Folgendes zurückgegeben wirdTrue
:quelle
Hier sind einige mögliche Wege, um diese Aufgabe zu erreichen:
PS: Verwenden Sie stattdessen "?.! /;:". Die Beispiele verwenden die Vokale ... und ja, "murcielago" ist das spanische Wort für Fledermaus ... lustiges Wort, da es alle Vokale enthält :)
PS2: Wenn Sie an Leistung interessiert sind, können Sie diese Versuche mit einem einfachen Code wie dem folgenden messen:
In meiner Box erhalten Sie:
Es scheint also, dass Versuch 4 der schnellste für diese bestimmte Eingabe ist.
quelle
list
Inattempt1
und das Tupel kann der"aeiou"
Einfachheit halber umgeschrieben werden (Entfernen[
und]
wird zu einem Generator, ohne eine Liste zu erstellen). Sie erstellen Tonnen von wegwerfbaren Zwischenzeichenfolgenattemt2
, Sie verwenden mehrere Regex-Anwendungen, inattempt3
denen Sie sier'[aeiou]'
in einem Durchgang verwenden können. Jeder hat Fehler - es ist schön, verschiedene Arten zu sehen, Dinge zu tun, aber bitte beheben Sie sie auch als gute VersucheHier ist meine Python 2/3 kompatible Version. Seitdem hat sich die Übersetzungs-API geändert.
quelle
dict.fromkeys(map(ord, '!@#$'))
, um die Karte zu erstellen.map
ist im Allgemeinen weniger lesbar als ein Listen- / Diktat- / Satz- / Generatorverständnis. So sehr, dass Guido es aus der Sprache entfernen wollte . Die Verwendungfromkeys
ist auch etwas clever und erfordert eine Dokumentenprüfung.str.maketrans('', '', chars)
, dass dieord
Konvertierung unddict
Konstruktion auf einmal erledigt werden (ganz zu schweigen davon, dass die Absicht offensichtlicher ist, da sie für die Paarung entwickelt wurdestr.translate
).quelle
'
als Zeichenfolge zu betrachten. docs.python.org/2/library/re.htmlWie wäre es damit:
quelle
Sie können auch eine Funktion verwenden, um andere reguläre Ausdrücke oder andere Muster durch die Verwendung einer Liste zu ersetzen. Damit können Sie reguläre Ausdrücke, Zeichenklassen und wirklich einfache Textmuster mischen. Dies ist sehr nützlich, wenn Sie viele Elemente wie HTML-Elemente ersetzen müssen.
* NB: funktioniert mit Python 3.x.
In der Funktion string_cleanup werden Ihre Zeichenfolge x und Ihre Liste nicht als Argumente verwendet. Wenn für jedes Element in dieser Liste von Elementen oder Mustern ein Ersatz benötigt wird, wird dies durchgeführt.
Die Ausgabe:
quelle
Meine Methode, die ich verwenden würde, würde wahrscheinlich nicht so effizient funktionieren, aber sie ist sehr einfach. Ich kann mehrere Zeichen an verschiedenen Positionen gleichzeitig entfernen, indem ich sie schneide und formatiere. Hier ist ein Beispiel:
Dies führt dazu, dass 'entfernt' das Wort 'dies' enthält.
Die Formatierung kann sehr hilfreich sein, um Variablen in der Mitte einer Druckzeichenfolge zu drucken. Es kann einen beliebigen Datentyp mit einem % gefolgt vom Datentyp der Variablen einfügen . Alle Datentypen können % s verwenden , und Floats (auch als Dezimalstellen bezeichnet) und Ganzzahlen können % d verwenden .
Das Schneiden kann zur komplizierten Kontrolle über Zeichenfolgen verwendet werden. Wenn ich Wörter [: 3] eingebe , kann ich alle Zeichen in der Zeichenfolge vom Anfang (der Doppelpunkt steht vor der Zahl, dies bedeutet "von Anfang bis") bis zum 4. Zeichen (einschließlich des 4.) auswählen Charakter). Der Grund, warum 3 bis zur 4. Position gleich ist, ist, dass Python bei 0 beginnt. Wenn ich dann das Wort [-1:] setze , bedeutet dies, dass das vorletzte Zeichen am Ende steht (der Doppelpunkt steht hinter der Zahl). Wenn Sie -1 setzen, zählt Python vom letzten Zeichen und nicht vom ersten. Wieder beginnt Python bei 0. Also, Wort [-1:] bedeutet also im Grunde 'vom vorletzten Zeichen bis zum Ende der Zeichenfolge.
Indem ich also die Zeichen vor dem Zeichen, das ich entfernen möchte, und die Zeichen danach abschneide und sie zusammenschiebe, kann ich das unerwünschte Zeichen entfernen. Stellen Sie es sich wie eine Wurst vor.In der Mitte ist es schmutzig, also möchte ich es loswerden. Ich schneide einfach die beiden Enden ab, die ich möchte, und setze sie dann ohne den unerwünschten Teil in der Mitte zusammen.
Wenn ich mehrere aufeinanderfolgende Zeichen entfernen möchte, verschiebe ich einfach die Zahlen im [] (Slicing-Teil). Oder wenn ich mehrere Zeichen von verschiedenen Positionen entfernen möchte, kann ich einfach mehrere Scheiben gleichzeitig zusammenfügen.
Beispiele:
entfernt ist gleich "cool".
entfernt entspricht 'macs'.
In diesem Fall bedeutet [3: 5] Zeichen an Position 3 bis Zeichen an Position 5 (ausgenommen das Zeichen an der Endposition).
Denken Sie daran, Python beginnt bei 0 zu zählen , das müssen Sie auch.
quelle
Probier diese:
Diese Methode funktioniert gut in Python 3.5.2
quelle
Sie können den regulären Ausdrucksersatz des re-Moduls verwenden. Mit dem Ausdruck ^ können Sie genau das auswählen, was Sie von Ihrer Zeichenfolge erwarten.
Die Ausgabe hierfür wäre "Thisisabsurd". Es werden nur Dinge angezeigt, die nach dem Symbol ^ angegeben sind.
quelle
Die Zeichenfolgenmethode
replace
ändert die ursprüngliche Zeichenfolge nicht. Es lässt das Original in Ruhe und gibt eine geänderte Kopie zurück.Was Sie wollen, ist so etwas wie:
line = line.replace(char,'')
Es ist jedoch sehr ineffizient, jedes Mal, wenn ein Zeichen entfernt wird, eine neue Zeichenfolge zu erstellen. Ich empfehle stattdessen Folgendes:
quelle
Unter einem .. ohne Verwendung des Konzepts für reguläre Ausdrücke ..
quelle
In Python 3.5
z.B,
So entfernen Sie die gesamte Nummer aus der Zeichenfolge
quelle
Sie können set verwenden
quelle
Rekursive Aufteilung: s = Zeichenfolge; Zeichen = zu entfernende Zeichen
Beispiel:
quelle
# Benennen Sie für jede Datei in einem Verzeichnis den Dateinamen um
quelle
Sogar der folgende Ansatz funktioniert
Ausgabe:
abcde
quelle
quelle