Erstens möchte ich anderen zustimmen, dass die Regex- oder str.translate(...)
basierten Lösungen am leistungsfähigsten sind. Für meinen Anwendungsfall war die Leistung dieser Funktion nicht signifikant, daher wollte ich Ideen hinzufügen, die ich mit diesen Kriterien berücksichtigte.
Mein Hauptziel war es, Ideen aus einigen der anderen Antworten in eine Lösung zu verallgemeinern, die für Zeichenfolgen funktionieren kann, die mehr als nur Regex-Wörter enthalten (dh die explizite Teilmenge von Interpunktionszeichen gegenüber Whitelist-Wortzeichen auf die schwarze Liste setzen).
Beachten Sie, dass bei jedem Ansatz auch die Verwendung string.punctuation
einer manuell definierten Liste in Betracht gezogen werden kann .
Option 1 - re
Ich war überrascht zu sehen, dass bisher keine Antwort re.sub (...) verwendet . Ich finde es eine einfache und natürliche Herangehensweise an dieses Problem.
import re
my_str = "Hey, you - what are you doing here!?"
words = re.split(r'\s+', re.sub(r'[,\-!?]', ' ', my_str).strip())
In dieser Lösung habe ich den Aufruf nach re.sub(...)
innen verschachtelt re.split(...)
- aber wenn die Leistung kritisch ist, kann das Kompilieren des regulären Ausdrucks von außen von Vorteil sein - für meinen Anwendungsfall war der Unterschied nicht signifikant, daher bevorzuge ich Einfachheit und Lesbarkeit.
Option 2 - str.replace
Dies sind noch ein paar Zeilen, aber es hat den Vorteil, dass es erweiterbar ist, ohne prüfen zu müssen, ob Sie einem bestimmten Zeichen in Regex entkommen müssen.
my_str = "Hey, you - what are you doing here!?"
replacements = (',', '-', '!', '?')
for r in replacements:
my_str = my_str.replace(r, ' ')
words = my_str.split()
Es wäre schön gewesen, die str.replace stattdessen der Zeichenfolge zuordnen zu können, aber ich glaube nicht, dass dies mit unveränderlichen Zeichenfolgen möglich ist, und während die Zuordnung zu einer Liste von Zeichen funktionieren würde, würde jeder Ersatz für jedes Zeichen ausgeführt klingt übertrieben. (Bearbeiten: Ein Funktionsbeispiel finden Sie in der nächsten Option.)
Option 3 - functools.reduce
(In Python 2 reduce
ist es im globalen Namespace verfügbar, ohne es aus functools zu importieren.)
import functools
my_str = "Hey, you - what are you doing here!?"
replacements = (',', '-', '!', '?')
my_str = functools.reduce(lambda s, sep: s.replace(sep, ' '), replacements, my_str)
words = my_str.split()