Il semble qu'il devrait y avoir un moyen plus simple :
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
C'est le cas ?
D'un 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 effectue des opérations brutes sur des chaînes de caractères en C avec une table de consultation. Il n'y a pas grand-chose de mieux que d'écrire votre propre code C.
Si la vitesse n’est pas un souci, une autre option l’est :
exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)
Cette méthode est plus rapide que s.replace pour chaque caractère, mais elle n’est pas aussi performante que les approches non purement pythoniques comme les regex ou string.translate, comme vous pouvez le voir dans les temps ci-dessous. Pour ce type de problème, il est préférable de procéder à un niveau aussi bas que possible.
Code de chronométrage :
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
Pas nécessairement plus simple, mais d'une manière différente, si vous êtes plus familier avec la famille re.
import re, string
s = "string. With. Punctuation?" # Sample string
out = re.sub('[%s]' % re.escape(string.punctuation), '', s)