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 ?
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 ?
Du point de vue de l'efficacité, vous ne pourrez pas battre translate() - il s'agit d'effectuer des opérations brutes sur des chaînes de caractères en C à l'aide d'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 peut être envisagée :
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 ne sera pas aussi performante que les approches non pythoniques telles que 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 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
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.