Sepertinya harus ada cara yang lebih sederhana daripada:
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
Disana?
python
string
punctuation
Lawrence Johnston
sumber
sumber
The temperature in the O'Reilly & Arbuthnot-Smythe server's main rack is 40.5 degrees.
" berisi persis SATU karakter tanda baca, yang kedua "."string.punctuation
tidak termasuk tanda baca non-Inggris sama sekali. Saya sedang berpikir tentang。 ,!? : × “” 〟, dan sebagainya.Jawaban:
Dari perspektif efisiensi, Anda tidak akan terkalahkan
Untuk versi Python yang lebih tinggi gunakan kode berikut:
Itu melakukan operasi string mentah di C dengan tabel pencarian - tidak banyak yang akan mengalahkan itu tetapi menulis kode C Anda sendiri.
Jika kecepatan bukan masalah, opsi lain adalah:
Ini lebih cepat daripada s.replace dengan masing-masing char, tetapi tidak akan berkinerja sebaik pendekatan python non-murni seperti regex atau string.translate, seperti yang Anda lihat dari timing di bawah ini. Untuk jenis masalah ini, melakukannya di level serendah mungkin terbayar.
Kode waktu:
Ini memberikan hasil sebagai berikut:
sumber
table = string.maketrans("","")
harus diganti dengantable = str.maketrans({key: None for key in string.punctuation})
?regex
sekarang adalah metode yang paling efisien! Ini hampir 2x lebih cepat daripada menerjemahkan. Juga, set dan ganti tidak lagi begitu buruk! Keduanya ditingkatkan lebih dari faktor 4 :)Ekspresi reguler cukup sederhana, jika Anda mengetahuinya.
sumber
s = re.sub(r'[^\w\s]','',s, re.UNICODE)
. Mengujinya dengan python 3 di linux ia bekerja bahkan tanpa bendera menggunakan huruf tamil, தமிழ்.Untuk kenyamanan penggunaan, saya meringkas catatan tanda baca striping dari string di kedua Python 2 dan Python 3. Silakan merujuk ke jawaban lain untuk deskripsi rinci.
Python 2
Python 3
sumber
sumber
str
Python 3, danunicode
Python 2,deletechars
argumennya tidak didukung.TypeError: translate() takes exactly one argument (2 given)
:(Saya biasanya menggunakan sesuatu seperti ini:
sumber
reduce(lambda s,c: s.replace(c, ''), string.punctuation, s)
.string.punctuation
hanya ASCII ! Cara yang lebih benar (tetapi juga jauh lebih lambat) adalah dengan menggunakan modul unicodedata:Anda dapat menggeneralisasi dan menghapus jenis karakter lain juga:
Ini juga akan menghapus karakter seperti
~*+§$
yang mungkin atau tidak mungkin "tanda baca" tergantung pada sudut pandang seseorang.sumber
regex.sub(ur"\p{P}+", "", text)
~
ini bukan bagian dari kategori tanda baca. Anda juga perlu menguji untuk kategori Simbol.Belum tentu lebih sederhana, tetapi dengan cara yang berbeda, jika Anda lebih akrab dengan keluarga kembali.
sumber
Untuk nilai Python 3
str
atau Python 2unicode
,str.translate()
hanya dibutuhkan kamus; codepoints (bilangan bulat) dilihat dalam pemetaan itu dan apa pun yang dipetakan untukNone
dihapus.Untuk menghapus tanda baca (beberapa?), Gunakan:
The
dict.fromkeys()
metode kelas membuatnya sepele untuk membuat pemetaan, pengaturan semua nilai untukNone
berdasarkan urutan kunci.Untuk menghapus semua tanda baca, tidak hanya tanda baca ASCII, tabel Anda harus sedikit lebih besar; lihat jawaban JF Sebastian (versi Python 3):
sumber
string.punctuation
tidak cukup. Lihat jawaban sayaunicode
objek vs objek Python 2str
.string.punctuation
merindukan banyak tanda baca yang biasa digunakan di dunia nyata. Bagaimana dengan solusi yang berfungsi untuk tanda baca non-ASCII?Secara pribadi, saya percaya ini adalah cara terbaik untuk menghapus tanda baca dari string dengan Python karena:
\{S}
menghapus tanda baca jika Anda ingin menghapusnya, tetapi pertahankan simbol seperti$
.\{Pd}
hanya akan menghapus tanda hubung.Ini menggunakan properti karakter Unicode, yang bisa Anda baca lebih lanjut di Wikipedia .
sumber
Saya belum melihat jawaban ini. Cukup gunakan regex; itu menghapus semua karakter selain karakter kata (
\w
) dan karakter angka (\d
), diikuti oleh karakter spasi putih (\s
):sumber
\d
redundan karena merupakan subset dari\w
.\w
dalam dokumentasi: docs.python.org/3/library/re.htmlBerikut ini adalah satu-liner untuk Python 3.5:
sumber
Ini mungkin bukan solusi terbaik namun ini adalah bagaimana saya melakukannya.
sumber
Berikut adalah fungsi yang saya tulis. Ini tidak terlalu efisien, tetapi sederhana dan Anda dapat menambah atau menghapus tanda baca yang Anda inginkan:
sumber
sumber
Sama seperti pembaruan, saya menulis ulang contoh @Brian di Python 3 dan membuat perubahan untuk memindahkan langkah kompilasi regex di dalam fungsi. Pikiranku di sini adalah mengatur waktu setiap langkah yang diperlukan untuk membuat fungsi berfungsi. Mungkin Anda menggunakan komputasi terdistribusi dan tidak dapat memiliki objek regex dibagi antara pekerja Anda dan perlu memiliki
re.compile
langkah pada setiap pekerja. Juga, saya ingin tahu waktu dua implementasi maketrans yang berbeda untuk Python 3vs.
Plus saya menambahkan metode lain untuk menggunakan set, di mana saya memanfaatkan fungsi persimpangan untuk mengurangi jumlah iterasi.
Ini adalah kode lengkap:
Ini hasil saya:
sumber
sumber
Inilah solusi tanpa regex.
sumber
Satu kalimat bisa membantu dalam kasus yang tidak terlalu ketat:
sumber
sumber
sumber
Kenapa tidak ada yang menggunakan ini?
Terlalu lambat?
sumber
Mempertimbangkan unicode. Kode diperiksa dalam python3.
sumber
Hapus kata-kata berhenti dari file teks menggunakan Python
sumber
Saya suka menggunakan fungsi seperti ini:
sumber
abc.strip(string.punctuation)
untuk itu. Itu tidak akan menghapus karakter seperti di tengah .