836 Stimmen

Beste Methode zum Entfernen von Interpunktionszeichen aus einer Zeichenkette

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?

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.

34voto

Vinko Vrsalovic Punkte 252104

Nicht unbedingt einfacher, aber ein anderer Weg, wenn Sie mit der Re-Familie besser vertraut sind.

import re, string
s = "string. With. Punctuation?" # Sample string 
out = re.sub('[%s]' % re.escape(string.punctuation), '', s)

1 Stimmen

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.

2 Stimmen

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.

1 Stimmen

Ja, ich habe es weggelassen, weil es für das Beispiel funktionierte, um die Dinge einfach zu halten, aber Sie haben Recht, dass es einbezogen werden sollte.

32voto

S.Lott Punkte 371691

Normalerweise verwende ich etwas in der Art:

>>> s = "string. With. Punctuation?" # Sample string
>>> import string
>>> for c in string.punctuation:
...     s= s.replace(c,"")
...
>>> s
'string With Punctuation'

2 Stimmen

Ein hässlicher Einzeiler: reduce(lambda s,c: s.replace(c, ''), string.punctuation, s) .

1 Stimmen

Großartig, entfernt jedoch einige Satzzeichen wie den längeren Bindestrich nicht

16voto

Martijn Pieters Punkte 953257

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'))

0 Stimmen

Zur Unterstützung von Unicode, string.punctuation ist nicht genug. Siehe meine Antwort

0 Stimmen

@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.

0 Stimmen

Die am häufigsten gewählte Antwort funktioniert nur für ascii-Strings. Ihre Antwort beansprucht ausdrücklich die Unicode-Unterstützung.

15voto

Zach Punkte 28461

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:

  • Entfernt alle Unicode-Satzzeichen
  • Sie ist leicht veränderbar, z. B. können Sie die \{S} wenn Sie Satzzeichen entfernen wollen, aber Symbole wie $ .
  • Sie können ganz genau festlegen, was Sie behalten und was Sie entfernen möchten, zum Beispiel \{Pd} werden nur Bindestriche entfernt.
  • Diese Regex normalisiert auch Leerzeichen. Sie wandelt Tabulatoren, Zeilenumbrüche und andere Unregelmäßigkeiten in schöne, einzelne Leerzeichen um.

Dabei werden Unicode-Zeicheneigenschaften verwendet, die lesen Sie mehr darüber auf Wikipedia .

1 Stimmen

Diese Linie funktioniert eigentlich nicht: remove = regex.compile(ur'[\p{C}|\p{M}|\p{P}|\p{S}|\p{Z}]+', regex.UNICODE)

0 Stimmen

@JohnStud Bricht in späteren Versionen von Python 3, weil jetzt alle Strings standardmäßig bereits Unicode unterstützen. Sie können das "u" aus den Zeilen 2, 3 und 4 entfernen und es funktioniert.

13voto

Blairg23 Punkte 9968

Ich habe diese Antwort noch nicht gesehen. Verwenden Sie einfach eine Regex; sie entfernt alle Zeichen außer Wortzeichen ( \w ) und Zahlenzeichen ( \d ), gefolgt von einem Whitespace-Zeichen ( \s ) :

import re
s = "string. With. Punctuation?" # Sample string 
out = re.sub(ur'[^\w\d\s]+', '', s)

3 Stimmen

\d ist redundant, da es eine Teilmenge von \w .

0 Stimmen

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?

0 Stimmen

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.com

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.

Powered by:

X