Pertama, saya ingin setuju dengan orang lain bahwa regex atau str.translate(...)
solusi berbasis paling performan. Untuk kasus penggunaan saya, kinerja fungsi ini tidak signifikan, jadi saya ingin menambahkan ide yang saya pertimbangkan dengan kriteria itu.
Tujuan utama saya adalah untuk menggeneralisasi ide dari beberapa jawaban lain menjadi satu solusi yang dapat bekerja untuk string yang berisi lebih dari sekedar kata regex (yaitu, daftar hitam subset eksplisit karakter tanda baca vs karakter kata daftar putih).
Perhatikan bahwa, dalam pendekatan apa pun, orang mungkin juga mempertimbangkan untuk menggunakan string.punctuation
menggantikan daftar yang ditentukan secara manual.
Opsi 1 - re.sub
Saya terkejut melihat tidak ada jawaban sejauh ini menggunakan re.sub (...) . Saya menemukan ini pendekatan yang sederhana dan alami untuk masalah ini.
import re
my_str = "Hey, you - what are you doing here!?"
words = re.split(r'\s+', re.sub(r'[,\-!?]', ' ', my_str).strip())
Dalam solusi ini, saya menyarangkan panggilan ke re.sub(...)
dalam re.split(...)
- tetapi jika kinerja sangat penting, mengkompilasi regex di luar bisa bermanfaat - untuk kasus penggunaan saya, perbedaannya tidak signifikan, jadi saya lebih suka kesederhanaan dan keterbacaan.
Opsi 2 - str.replace
Ini adalah beberapa baris lagi, tetapi memiliki keuntungan diperluas tanpa harus memeriksa apakah Anda perlu melarikan diri dari karakter tertentu di regex.
my_str = "Hey, you - what are you doing here!?"
replacements = (',', '-', '!', '?')
for r in replacements:
my_str = my_str.replace(r, ' ')
words = my_str.split()
Akan lebih baik untuk dapat memetakan str.replace ke string sebagai gantinya, tapi saya tidak berpikir itu bisa dilakukan dengan string yang tidak dapat diubah, dan sementara memetakan terhadap daftar karakter akan bekerja, menjalankan setiap penggantian terhadap setiap karakter terdengar berlebihan. (Edit: Lihat opsi selanjutnya untuk contoh fungsional.)
Opsi 3 - functools.reduce
(Dalam Python 2, reduce
tersedia di namespace global tanpa mengimpornya dari functools.)
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()