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 das?
Unter dem Gesichtspunkt der Effizienz sind Sie nicht zu schlagen
s.translate(None, string.punctuation)
Für höhere Versionen von Python verwenden Sie den folgenden Code:
s.translate(str.maketrans('', '', string.punctuation))
Er führt rohe String-Operationen in C mit einer Lookup-Tabelle durch - es gibt nicht viel, was das übertrifft, außer dem Schreiben von eigenem C-Code.
Wenn die Geschwindigkeit keine Rolle spielt, gibt es eine andere Möglichkeit:
exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)
Dies ist schneller als s.replace mit jedem Zeichen, aber nicht so gut wie nicht-pure Python-Ansätze wie regexes oder string.translate, wie Sie aus den untenstehenden Zeitangaben ersehen können. Bei dieser Art von Problem zahlt es sich aus, es auf so niedriger Ebene wie möglich zu machen.
Zeitlicher Code:
import re, string, timeit
s = "string. With. Punctuation"
exclude = set(string.punctuation)
table = string.maketrans("","")
regex = re.compile('[%s]' % re.escape(string.punctuation))
def test_set(s):
return ''.join(ch for ch in s if ch not in exclude)
def test_re(s): # From Vinko's solution, with fix.
return regex.sub('', s)
def test_trans(s):
return s.translate(table, string.punctuation)
def test_repl(s): # From S.Lott's solution
for c in string.punctuation:
s=s.replace(c,"")
return s
print "sets :",timeit.Timer('f(s)', 'from __main__ import s,test_set as f').timeit(1000000)
print "regex :",timeit.Timer('f(s)', 'from __main__ import s,test_re as f').timeit(1000000)
print "translate :",timeit.Timer('f(s)', 'from __main__ import s,test_trans as f').timeit(1000000)
print "replace :",timeit.Timer('f(s)', 'from __main__ import s,test_repl as f').timeit(1000000)
Dies führt zu den folgenden Ergebnissen:
sets : 19.8566138744
regex : 6.86155414581
translate : 2.12455511093
replace : 28.4436721802
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)