Es scheint, dass es einen einfacheren Weg geben sollte als:
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
Gibt es?
python
string
punctuation
Lawrence Johnston
quelle
quelle
The temperature in the O'Reilly & Arbuthnot-Smythe server's main rack is 40.5 degrees.
" enthält genau EIN Interpunktionszeichen, das zweite "."string.punctuation
überhaupt keine nicht-englische Zeichensetzung enthält. Ich denke an。 ,! : : × “” 〟und so weiter.Antworten:
Aus Sicht der Effizienz werden Sie nicht schlagen
Verwenden Sie für höhere Versionen von Python den folgenden Code:
Es führt rohe Zeichenfolgenoperationen in C mit einer Nachschlagetabelle durch - es gibt nicht viel, das das übertrifft, außer Ihren eigenen C-Code zu schreiben.
Wenn Geschwindigkeit keine Sorge ist, ist eine andere Option:
Dies ist schneller als das Ersetzen mit jedem Zeichen, funktioniert jedoch nicht so gut wie nicht reine Python-Ansätze wie Regexes oder string.translate, wie Sie aus den folgenden Zeitangaben ersehen können. Für diese Art von Problem zahlt es sich aus, es so niedrig wie möglich zu halten.
Timing-Code:
Dies ergibt die folgenden Ergebnisse:
quelle
table = string.maketrans("","")
durchtable = str.maketrans({key: None for key in string.punctuation})
? Ersetzt werden ?regex
ist jetzt die effizienteste Methode! Es ist fast 2x schneller als übersetzen. Auch Sets und Ersetzen sind nicht mehr so schlecht! Sie sind beide um mehr als den Faktor 4 verbessert :)Reguläre Ausdrücke sind einfach genug, wenn Sie sie kennen.
quelle
s = re.sub(r'[^\w\s]','',s, re.UNICODE)
. Wenn Sie es mit Python 3 unter Linux testen, funktioniert es auch ohne Flag mit tamilischen Buchstaben, தமிழ்.Zur Vereinfachung der Verwendung fasse ich den Hinweis auf das Entfernen von Interpunktion aus einer Zeichenfolge in Python 2 und Python 3 zusammen. Eine ausführliche Beschreibung finden Sie in anderen Antworten.
Python 2
Python 3
quelle
quelle
str
in Python 3 undunicode
in Python 2 dasdeletechars
Argument nicht unterstützt wird.TypeError: translate() takes exactly one argument (2 given)
:(Normalerweise benutze ich so etwas:
quelle
reduce(lambda s,c: s.replace(c, ''), string.punctuation, s)
.string.punctuation
ist nur ASCII ! Eine korrektere (aber auch viel langsamere) Methode ist die Verwendung des Unicodedata-Moduls:Sie können auch andere Zeichentypen verallgemeinern und entfernen:
Es werden auch Zeichen entfernt,
~*+§$
die je nach Sichtweise eine "Interpunktion" sein können oder nicht.quelle
regex.sub(ur"\p{P}+", "", text)
~
nicht zur Kategorie Interpunktion. Sie müssen auch die Kategorie Symbole testen.Nicht unbedingt einfacher, aber anders, wenn Sie mit der Re-Familie besser vertraut sind.
quelle
Für Python 3-
str
oder Python 2-unicode
Werte wirdstr.translate()
nur ein Wörterbuch verwendet. Codepunkte (Ganzzahlen) werden in dieser Zuordnung nachgeschlagen und alles, was zugeordnet ist,None
wird entfernt.Verwenden Sie zum Entfernen von (einigen?) Satzzeichen:
Die
dict.fromkeys()
Klassenmethode macht es einfach, das Mapping zu erstellen und alle WerteNone
basierend auf der Tastenfolge festzulegen.Um alle Interpunktionen zu entfernen , nicht nur die ASCII-Interpunktion, muss Ihre Tabelle etwas größer sein. siehe JF Sebastians Antwort (Python 3-Version):
quelle
string.punctuation
reicht nicht aus. Siehe meine Antwortunicode
Objekte im Vergleich zu Python 2-str
Objekten bereitzustellen .string.punctuation
Es fehlen viele Satzzeichen, die in der realen Welt häufig verwendet werden. Wie wäre es mit einer Lösung, die für Nicht-ASCII-Interpunktion funktioniert?Persönlich glaube ich, dass dies der beste Weg ist, um Interpunktion aus einer Zeichenfolge in Python zu entfernen, weil:
\{S}
wenn Sie Interpunktion entfernen möchten, aber Symbole wie beibehalten$
.\{Pd}
werden nur Bindestriche entfernt.Hierbei werden Unicode-Zeicheneigenschaften verwendet, über die Sie auf Wikipedia mehr lesen können .
quelle
Ich habe diese Antwort noch nicht gesehen. Verwenden Sie einfach einen regulären Ausdruck. Es werden alle Zeichen außer Wortzeichen (
\w
) und Zahlenzeichen (\d
) entfernt, gefolgt von einem Leerzeichen (\s
):quelle
\d
ist redundant, da es sich um eine Teilmenge von handelt\w
.\w
in der Dokumentation: docs.python.org/3/library/re.htmlHier ist ein Einzeiler für Python 3.5:
quelle
Dies ist möglicherweise nicht die beste Lösung, aber so habe ich es gemacht.
quelle
Hier ist eine Funktion, die ich geschrieben habe. Es ist nicht sehr effizient, aber es ist einfach und Sie können jede gewünschte Interpunktion hinzufügen oder entfernen:
quelle
quelle
Nur als Update habe ich das @ Brian-Beispiel in Python 3 neu geschrieben und Änderungen daran vorgenommen, um den Regex-Kompilierungsschritt innerhalb der Funktion zu verschieben. Mein Gedanke hier war, jeden einzelnen Schritt zu planen, der erforderlich ist, damit die Funktion funktioniert. Möglicherweise verwenden Sie verteiltes Computing und können kein Regex-Objekt zwischen Ihren Mitarbeitern teilen. Sie müssen
re.compile
bei jedem Mitarbeiter einen Schritt ausführen. Außerdem war ich neugierig, zwei verschiedene Implementierungen von Maketrans für Python 3 zu planenvs.
Außerdem habe ich eine weitere Methode zur Verwendung von set hinzugefügt, bei der ich die Schnittfunktion nutze, um die Anzahl der Iterationen zu reduzieren.
Dies ist der vollständige Code:
Das sind meine Ergebnisse:
quelle
quelle
Hier ist eine Lösung ohne Regex.
quelle
Ein Einzeiler kann in nicht sehr strengen Fällen hilfreich sein:
quelle
quelle
quelle
Warum benutzt keiner von euch das?
Zu langsam?
quelle
Berücksichtigung von Unicode. Code in Python3 überprüft.
quelle
Entfernen Sie mit Python Stoppwörter aus der Textdatei
quelle
Ich benutze gerne eine Funktion wie diese:
quelle
abc.strip(string.punctuation)
stattdessen dafür. Solche Zeichen in der Mitte werden nicht entfernt .