Du point de vue de l'efficacité, vous n'allez pas battre
s.translate(None, string.punctuation)
Pour les versions supérieures de Python, utilisez le code suivant:
s.translate(str.maketrans('', '', string.punctuation))
Il exécute des opérations de chaîne brutes en C avec une table de recherche - il n'y a pas grand-chose qui va battre cela, mais écrire votre propre code C.
Si la vitesse n'est pas un problème, une autre option est:
exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)
Ceci est plus rapide que le remplacement avec chaque caractère, mais ne fonctionnera pas aussi bien que les approches python non pures telles que les expressions régulières ou string.translate, comme vous pouvez le voir dans les timings ci-dessous. Pour ce type de problème, le faire au niveau le plus bas possible est payant.
Code temporel:
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)
Cela donne les résultats suivants:
sets : 19.8566138744
regex : 6.86155414581
translate : 2.12455511093
replace : 28.4436721802