Bundan daha basit bir yol olmalı gibi görünüyor:
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
Var mı?
Verimlilik açısından bakacak olursak
s.translate(None, string.punctuation)
Python'un daha yüksek sürümleri için aşağıdaki kodu kullanın:
s.translate(str.maketrans('', '', string.punctuation))
C'de bir arama tablosu ile ham dize işlemleri gerçekleştiriyor - kendi C kodunuzu yazmaktan başka bunu yenecek pek bir şey yok.
Eğer hız bir endişe kaynağı değilse, başka bir seçenek daha var:
exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)
Bu, her karakterde s.replace kullanmaktan daha hızlıdır, ancak aşağıdaki zamanlamalardan da görebileceğiniz gibi, regexes veya string.translate gibi saf olmayan python yaklaşımları kadar iyi performans göstermeyecektir. Bu tür bir problem için, mümkün olduğunca düşük bir seviyede yapmak işe yarar.
Zamanlama kodu:
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)
Bu da aşağıdaki sonuçları verir:
sets : 19.8566138744
regex : 6.86155414581
translate : 2.12455511093
replace : 28.4436721802
Daha basit olması gerekmez, ancak re ailesine daha aşina iseniz farklı bir yol.
import re, string
s = "string. With. Punctuation?" # Sample string
out = re.sub('[%s]' % re.escape(string.punctuation), '', s)