811 votes

Meilleure façon de supprimer la ponctuation d'une chaîne de caractères en Python

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 ?

1228voto

Brian Points 48423

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

195voto

Eratosthenes Points 79

Les expressions régulières sont assez simples, si vous les connaissez.

import re
s = "string. With. Punctuation?"
s = re.sub(r'[^\w\s]','',s)

52voto

pyrou Points 191
myString.translate(None, string.punctuation)

34voto

Vinko Vrsalovic Points 116138

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)

33voto

S.Lott Points 207588

J'utilise généralement quelque chose comme ça :

>>> s = "string. With. Punctuation?" # Sample string
>>> import string
>>> for c in string.punctuation:
...     s= s.replace(c,"")
...
>>> s
'string With Punctuation'

Prograide.com

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.

Powered by:

X