python – Best way to strip punctuation from a string

python – Best way to strip punctuation from a string

From an efficiency perspective, youre not going to beat

s.translate(None, string.punctuation)

For higher versions of Python use the following code:

s.translate(str.maketrans(, , string.punctuation))

Its performing raw string operations in C with a lookup table – theres not much that will beat that but writing your own C code.

If speed isnt a worry, another option though is:

exclude = set(string.punctuation)
s = .join(ch for ch in s if ch not in exclude)

This is faster than s.replace with each char, but wont perform as well as non-pure python approaches such as regexes or string.translate, as you can see from the below timings. For this type of problem, doing it at as low a level as possible pays off.

Timing 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 Vinkos solution, with fix.
    return regex.sub(, s)

def test_trans(s):
    return s.translate(table, string.punctuation)

def test_repl(s):  # From S.Lotts 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)

This gives the following results:

sets      : 19.8566138744
regex     : 6.86155414581
translate : 2.12455511093
replace   : 28.4436721802

Regular expressions are simple enough, if you know them.

import re
s = string. With. Punctuation?
s = re.sub(r[^ws],,s)

python – Best way to strip punctuation from a string

For the convenience of usage, I sum up the note of striping punctuation from a string in both Python 2 and Python 3. Please refer to other answers for the detailed description.


Python 2

import string

s = string. With. Punctuation?
table = string.maketrans(,)
new_s = s.translate(table, string.punctuation)      # Output: string without punctuation

Python 3

import string

s = string. With. Punctuation?
table = str.maketrans(dict.fromkeys(string.punctuation))  # OR {key: None for key in string.punctuation}
new_s = s.translate(table)                          # Output: string without punctuation

Leave a Reply

Your email address will not be published. Required fields are marked *