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?
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.
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"
>>> line = "abc#@!?efg12;:?"
>>> ''.join( c for c in line if c not in '?:!/;' )
'abc#@efg12'
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.
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.
line = line.translate(None, " ?.!/;:")
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