Es scheint einen einfacheren Weg zu geben als:
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
Gibt es eine?
Es scheint einen einfacheren Weg zu geben als:
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
Gibt es eine?
Funktioniert, weil string.punctuation die Folge ,-. in richtiger, aufsteigender, lückenloser ASCII-Reihenfolge hat. Während Python dies richtig macht, kann es bei der Verwendung einer Teilmenge von string.punctuation wegen des überraschenden "-" ein Show-Stopper sein.
Eigentlich ist es immer noch falsch. Die Sequenz "\]" wird als Escape behandelt (zufälligerweise wird das ] nicht geschlossen, so dass ein weiterer Fehler umgangen wird), aber \ bleibt unescaped. Sie sollten re.escape(string.punctuation) verwenden, um dies zu verhindern.
Für Python 3 str
oder Python 2 unicode
Werte, str.translate()
benötigt nur ein Wörterbuch; Codepoints (ganze Zahlen) werden in dieser Zuordnung nachgeschlagen und alles, was auf None
entfernt wird.
Um dann (einige?) Satzzeichen zu entfernen, verwenden Sie:
import string
remove_punct_map = dict.fromkeys(map(ord, string.punctuation))
s.translate(remove_punct_map)
Die dict.fromkeys()
Klassenmethode macht es trivial, die Zuordnung zu erstellen, indem alle Werte auf None
basierend auf der Reihenfolge der Schlüssel.
Zum Entfernen todo Zeichensetzung, nicht nur ASCII-Zeichensetzung, muss die Tabelle etwas größer sein; siehe J.F. Sebastians Antwort (Python 3-Version):
import unicodedata
import sys
remove_punct_map = dict.fromkeys(i for i in range(sys.maxunicode)
if unicodedata.category(chr(i)).startswith('P'))
@J.F.Sebastian: In der Tat, meine Antwort hat nur die gleichen Zeichen verwendet wie die, die am häufigsten gewählt wurde. Ich habe eine Python 3-Version Ihrer Tabelle hinzugefügt.
Die am häufigsten gewählte Antwort funktioniert nur für ascii-Strings. Ihre Antwort beansprucht ausdrücklich die Unicode-Unterstützung.
string.punctuation
lässt eine Menge Satzzeichen vermissen, die in der realen Welt häufig verwendet werden. Wie wäre es mit einer Lösung, die auch für Nicht-ASCII-Satzzeichen funktioniert?
import regex
s = u"string. With. SomeReally WeirdNonASCII Punctuation?"
remove = regex.compile(ur'[\p{C}|\p{M}|\p{P}|\p{S}|\p{Z}]+', regex.UNICODE)
remove.sub(u" ", s).strip()
Ich persönlich glaube, dass dies der beste Weg ist, um Satzzeichen aus einer Zeichenkette in Python zu entfernen, weil:
\{S}
wenn Sie Satzzeichen entfernen wollen, aber Symbole wie $
.\{Pd}
werden nur Bindestriche entfernt.Dabei werden Unicode-Zeicheneigenschaften verwendet, die lesen Sie mehr darüber auf Wikipedia .
Diese Linie funktioniert eigentlich nicht: remove = regex.compile(ur'[\p{C}|\p{M}|\p{P}|\p{S}|\p{Z}]+', regex.UNICODE)
Zahlenzeichen werden als Untergruppe von Word-Zeichen betrachtet? Ich dachte, ein Word-Zeichen sei jedes Zeichen, das ein echtes Wort bilden kann, z. B. a-zA-Z?
Ja, ein "Wort" in regex umfasst Alphabete, Zahlen und Unterstriche. Bitte lesen Sie die Beschreibung für \w
in der Dokumentation: docs.python.org/3/Bibliothek/re.html
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
4 Stimmen
Das scheint mir ziemlich einfach zu sein. Warum wollen Sie es ändern? Wenn Sie es einfacher haben wollen, verpacken Sie einfach, was Sie gerade geschrieben haben, in eine Funktion.
3 Stimmen
Nun, es schien nur ein bisschen hackish zu sein, mit Art von einem Nebeneffekt von str.translate, um die Arbeit zu tun. Ich dachte, es könnte etwas mehr wie str.strip(chars), die auf die gesamte Zeichenfolge anstelle von nur die Grenzen, die ich verpasst hatte gearbeitet werden.
2 Stimmen
Das hängt auch von den Daten ab. Die Verwendung bei Daten, die Servernamen mit Unterstrichen als Teil des Namens enthalten (was an manchen Orten recht häufig vorkommt), könnte schlecht sein. Seien Sie sicher, dass Sie die Daten kennen und wissen, was sie enthalten, oder Sie könnten am Ende mit einer Teilmenge des Problems clbuttic.
65 Stimmen
Es kommt auch darauf an, was Sie als Interpunktion bezeichnen. "
The temperature in the O'Reilly & Arbuthnot-Smythe server's main rack is 40.5 degrees.
" enthält genau EIN Interpunktionszeichen, das zweite ".45 Stimmen
Ich bin überrascht, dass das noch niemand erwähnt hat.
string.punctuation
enthält überhaupt keine nicht-englischen Satzzeichen. Ich denke an ×"", und so weiter.2 Stimmen
Funktioniert nicht mit einer Unicode-Zeichenkette?
2 Stimmen
@JohnMachin du vergisst, dass
' '
ist Zeichensetzung .2 Stimmen
Ab Python 3.1 (bis mindestens 3.8.3), werden Sie wollen:
str.maketrans("","", string.punctuation)
per diese Dokumentation mit der Änderung dokumentiert in 3.10 Stimmen
Die meisten Diskussionen hier betreffen Python 2, diese Frage ist ähnlich hat aber bessere Antworten als Python 3.
0 Stimmen
Ich habe die Lösung nicht gesehen
s.strip(string.punctuation)
; beantwortet das nicht die Frage? Was übersehe ich?0 Stimmen
Es ist unklar, was das Problem/die Qualifikationen hier sind; daher ist diese Frage derzeit nicht themenbezogen. Was ist an der angewandten Methode nicht einfach genug? Bitte klären Sie sachlich, was Sie daran für zu komplex halten. Ist eine Zeile zu viel? Ist es die Anzahl der dafür erforderlichen Funktionen? Ist es eine bestimmte Funktion, die Sie lieber vermeiden würden? Etc.
0 Stimmen
@Clément Hier ist eine gute Unicode-bewusste Antwort
0 Stimmen
@Brownbat Und mit Python 3 meinen Sie "Unicode-fähig". Mein vorheriger Kommentar verweist auf eine Antwort auf diese Frage, die Unicode-fähig ist und sowohl die Unicode-Kategorien "S" (Symbole) und "P" (Interpunktion) erwähnt.