Pro-Tipp: Verwenden Sie string.translate
für die schnellsten Zeichenkettenoperationen, die Python zu bieten hat.
Ein paar Beweise...
Zuerst der langsame Weg (Entschuldigung pprzemek):
>>> import timeit
>>> S = 'Hey, du - was machst du hier!?'
>>> def my_split(s, seps):
... res = [s]
... for sep in seps:
... s, res = res, []
... for seq in s:
... res += seq.split(sep)
... return res
...
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552
Dann verwenden wir re.findall()
(wie im vorgeschlagenen Antwort gegeben). VIEL schneller:
>>> timeit.Timer('findall(r"\w+", S)', 'from __main__ import S; from re import findall').timeit()
4.194725036621094
Zuletzt verwenden wir translate
:
>>> from string import translate,maketrans,punctuation
>>> T = maketrans(punctuation, ' '*len(punctuation))
>>> timeit.Timer('translate(S, T).split()', 'from __main__ import S,T,translate').timeit()
1.2835021018981934
Erklärung:
string.translate
ist in C implementiert und anders als viele Zeichenkettenmanipulationsfunktionen in Python erzeugt string.translate
keine neue Zeichenkette. Es ist also so schnell wie möglich für Zeichenaustausch.
Es ist jedoch etwas umständlich, da es eine Übersetzungstabelle benötigt, um diese Magie zu vollbringen. Sie können eine Übersetzungstabelle mit der Bequemlichkeitsfunktion maketrans()
erstellen. Das Ziel hier ist es, alle unerwünschten Zeichen in Leerzeichen zu übersetzen. Ein-Eins-Ersatz. Auch hier wird keine neue Daten erzeugt. Also ist das schnell!
Dann verwenden wir das gute alte split()
. split()
wird standardmäßig auf alle Leerzeichenzeichen angewendet, die sie gruppiert für die Aufteilung zusammen. Das Ergebnis wird die Liste der Wörter sein, die Sie möchten. Und dieser Ansatz ist fast 4-mal schneller als re.findall()
!
7 Stimmen
docs.python.org/library/re.html
13 Stimmen
Python's
str.split()
funktioniert auch ohne Argumente überhaupt