İlk olarak, regex veya str.translate(...)
tabanlı çözümlerin en iyi performans gösterdiğini başkalarıyla kabul etmek istiyorum . Kullanım durumum için bu işlevin performansı önemli değildi, bu yüzden bu ölçütlerle düşündüğüm fikirleri eklemek istedim.
Benim asıl amacım, diğer cevaplardan bazı fikirleri, sadece normal ifadelerden daha fazlasını içeren dizeler için çalışabilecek tek bir çözüme dönüştürmekti.
Herhangi bir yaklaşımda, string.punctuation
manuel olarak tanımlanmış bir liste yerine kullanmayı da düşünebilirsiniz .
Seçenek 1 - re.sub
Şimdiye kadar hiçbir cevap görmek için sürpriz oldu re.sub (...) kullanır . Bunu bu soruna basit ve doğal bir yaklaşım olarak görüyorum.
import re
my_str = "Hey, you - what are you doing here!?"
words = re.split(r'\s+', re.sub(r'[,\-!?]', ' ', my_str).strip())
Bu çözümde, çağrıyı iç içe re.sub(...)
yerleştirdim re.split(...)
- ancak performans kritikse, normal ifadeyi dışarıda derlemek faydalı olabilir - kullanım durumum için fark önemli değildi, bu yüzden basitlik ve okunabilirliği tercih ediyorum.
Seçenek 2 - str.replace
Bu birkaç satır daha, ancak regex'te belirli bir karakterden kaçmanız gerekip gerekmediğini kontrol etmek zorunda kalmadan genişletilebilir olma avantajına sahiptir.
my_str = "Hey, you - what are you doing here!?"
replacements = (',', '-', '!', '?')
for r in replacements:
my_str = my_str.replace(r, ' ')
words = my_str.split()
Bunun yerine str.replace'ı dizeye eşlemek güzel olurdu, ancak değişmez dizelerle yapılabileceğini düşünmüyorum ve bir karakter listesine karşı eşleme yaparken her karaktere karşı her yedek çalışacaktı kulağa aşırı geliyor. (Düzenle: İşlevsel bir örnek için bir sonraki seçeneğe bakın.)
Seçenek 3 - functools.reduce
(Python 2'de reduce
global ad alanında functools'tan içe aktarılmadan kullanılabilir.)
import functools
my_str = "Hey, you - what are you doing here!?"
replacements = (',', '-', '!', '?')
my_str = functools.reduce(lambda s, sep: s.replace(sep, ' '), replacements, my_str)
words = my_str.split()