Từ góc độ hiệu quả, bạn sẽ không đánh bại
s.translate(None, string.punctuation)
Đối với các phiên bản cao hơn của Python, sử dụng mã sau:
s.translate(str.maketrans('', '', string.punctuation))
Đó là thực hiện các hoạt động chuỗi thô trong C bằng bảng tra cứu - không có nhiều thứ sẽ đánh bại điều đó ngoài việc viết mã C của riêng bạn.
Nếu tốc độ không phải là một mối lo, thì một lựa chọn khác là:
exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)
Tốc độ này nhanh hơn s.replace với mỗi char, nhưng sẽ không thực hiện cũng như các cách tiếp cận python không thuần túy như regexes hoặc string.translate, như bạn có thể thấy trong các khoảng thời gian dưới đây. Đối với loại vấn đề này, làm nó ở mức độ thấp nhất có thể sẽ được đền đáp.
Mã thời gian:
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)
Điều này cho kết quả như sau:
sets : 19.8566138744
regex : 6.86155414581
translate : 2.12455511093
replace : 28.4436721802