Saya mencoba untuk menghapus karakter tertentu dari string menggunakan Python. Ini adalah kode yang saya gunakan sekarang. Sayangnya tampaknya tidak melakukan apa pun pada string.
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
Bagaimana saya melakukan ini dengan benar?
python
string
immutability
Matt Phillips
sumber
sumber
filter
fungsi dan Ekspresi Lambda:filter(lambda ch: ch not in " ?.!/;:", line)
. Cukup ringkas dan efisien juga, saya pikir. Tentu saja, ini mengembalikan string baru yang harus Anda tetapkan namanya.Jawaban:
String dalam Python tidak dapat diubah (tidak dapat diubah). Karena itu, efeknya
line.replace(...)
hanya untuk membuat string baru, daripada mengubah yang lama. Anda perlu mem - rebind (menugaskan) ituline
agar variabel itu mengambil nilai baru, dengan karakter-karakter itu dihapus.Juga, cara Anda melakukannya akan agak lambat, relatif. Ini juga mungkin agak membingungkan bagi pythonators berpengalaman, yang akan melihat struktur bersarang ganda dan berpikir sejenak bahwa sesuatu yang lebih rumit sedang terjadi.
Dimulai dengan Python 2.6 dan versi Python 2.x yang lebih baru *, Anda dapat menggunakan
str.translate
, (tetapi baca terus untuk perbedaan Python 3):atau penggantian ekspresi reguler dengan
re.sub
Karakter yang dilampirkan dalam tanda kurung merupakan kelas karakter . Setiap karakter
line
yang ada di kelas itu diganti dengan parameter kedua menjadisub
: string kosong.Dalam Python 3, string adalah Unicode. Anda harus menerjemahkan sedikit berbeda. kevpie menyebutkan ini dalam komentar di salah satu jawaban, dan itu tercantum dalam dokumentasi untuk
str.translate
.Saat memanggil
translate
metode string Unicode, Anda tidak dapat melewatkan parameter kedua yang kami gunakan di atas. Anda juga tidak dapat lulusNone
sebagai parameter pertama. Sebagai gantinya, Anda melewati tabel terjemahan (biasanya kamus) sebagai satu-satunya parameter. Tabel ini memetakan nilai - nilai ordinal karakter (yaitu hasil memanggilnyaord
) ke nilai-nilai ordinal karakter yang harus menggantikannya, atau — berguna bagi kita —None
untuk menunjukkan bahwa mereka harus dihapus.Jadi untuk melakukan tarian di atas dengan string Unicode Anda akan memanggil sesuatu seperti
Di sini
dict.fromkeys
danmap
digunakan untuk membuat kamus berisi secara ringkasLebih sederhana, seperti jawaban lain , buat tabel terjemahan di tempat:
Atau buat tabel terjemahan yang sama dengan
str.maketrans
:* untuk kompatibilitas dengan Python sebelumnya, Anda dapat membuat tabel terjemahan "null" untuk menggantikan
None
:Di sini
string.maketrans
digunakan untuk membuat tabel terjemahan , yang hanya berupa string yang berisi karakter dengan nilai ordinal 0 hingga 255.sumber
line.translate
hanya perlu satu argumen dan solusi pertama tidak akan berfungsiline.translate({ord(i):None for i in '!@#$'})
"'"
untuk set karakter.notes = notes.translate({ord(i):None for i in '\"\''})
unicode_line.translate(str.maketrans('', '', '!@#$'))
. Atauunicode_line.translate(dict.fromkeys(map(ord, '!@#$')))
Apakah saya kehilangan poin di sini, atau hanya sebagai berikut:
Letakkan dalam satu lingkaran:
sumber
for char in b: a=a.replace(char,"")
string=string.replace("1","")
sebaliknya. Anda agak mengatakan ini di bagian loop dari contoh Anda, tetapi kebanyakan orang tidak akan membaca sejauh itu ke jawaban Anda sampai setelah mereka mengutak-atik kode sedikit lebih dulu untuk pertanyaan sederhana.sumber
blacklist = set('?:!/;')
dan kemudian''.join(c for c in line if c not in blacklist)
Peasy mudah dengan
re.sub
ekspresi reguler pada Python 3.5Contoh
Penjelasan
Dalam ekspresi reguler (regex),
|
adalah OR logis dan\
lolos dari spasi dan karakter khusus yang mungkin perintah regex aktual. Sedangkansub
singkatan dari substitusi, dalam hal ini dengan string kosong''
.sumber
Untuk persyaratan terbalik dengan hanya mengizinkan karakter tertentu dalam string, Anda dapat menggunakan ekspresi reguler dengan operator pelengkap yang ditetapkan
[^ABCabc]
. Misalnya, untuk menghapus semuanya kecuali huruf ascii, digit, dan tanda hubung:Dari dokumentasi ekspresi reguler python :
sumber
Penanya hampir memilikinya. Seperti kebanyakan hal dalam Python, jawabannya lebih sederhana daripada yang Anda pikirkan.
Anda tidak harus melakukan hal loop bersarang jika / untuk, tetapi Anda perlu memeriksa setiap karakter secara terpisah.
sumber
sumber
sumber
String tidak berubah dalam Python. The
replace
method mengembalikan string baru setelah penggantian. Mencoba:sumber
line
.Saya terkejut bahwa belum ada yang merekomendasikan menggunakan fungsi filter builtin .
Katakanlah kita ingin menyaring semua yang bukan angka. Menggunakan metode filter builtin "... setara dengan ekspresi generator (item untuk item di iterable jika fungsi (item))" [ Python 3 Builtins: Filter ]
Dalam Python 3 ini kembali
Untuk mendapatkan string yang dicetak,
Saya tidak yakin bagaimana peringkat filter dalam hal efisiensi tetapi itu adalah hal yang baik untuk mengetahui bagaimana menggunakan ketika melakukan pemahaman daftar dan semacamnya.
MEMPERBARUI
Secara logis, karena filter berfungsi, Anda juga dapat menggunakan pemahaman daftar dan dari apa yang telah saya baca seharusnya lebih efisien karena lambda adalah pengelola dana lindung nilai dari dunia fungsi pemrograman. Kelebihan lainnya adalah bahwa itu adalah satu-liner yang tidak memerlukan impor apa pun. Misalnya, menggunakan string yang sama yang ditentukan di atas,
Itu dia. Kembali akan menjadi string dari semua karakter yang merupakan digit dalam string asli.
Jika Anda memiliki daftar karakter khusus yang dapat diterima / tidak dapat diterima, Anda hanya perlu menyesuaikan bagian 'jika' dari pemahaman daftar.
atau sebagai alternatif,
sumber
operator.contains
jika Anda menggunakanlambda
.lambda x: operator.contains(intsList, x)
harus diejalambda x: x in intsList
, atau jika Anda mencoba untuk mendapatkan pemeriksaan tingkat C,intsList.__contains__
(tidaklambda
sama sekali) akan melakukan trik.Dengan menggunakan
filter
, Anda hanya perlu satu barisIni memperlakukan string sebagai iterable dan memeriksa setiap karakter jika
lambda
mengembalikanTrue
:sumber
Berikut beberapa cara yang mungkin untuk mencapai tugas ini:
PS: Alih-alih menggunakan "?.! / ;:" contoh menggunakan vokal ... dan ya, "murcielago" adalah kata Spanyol untuk mengatakan kelelawar ... kata lucu karena berisi semua vokal :)
PS2: Jika Anda tertarik pada kinerja, Anda dapat mengukur upaya ini dengan kode sederhana seperti:
Di kotak saya, Anda akan mendapatkan:
Jadi sepertinya try4 adalah yang tercepat untuk input khusus ini.
sumber
list
diattempt1
dan tuple dapat ditulis ulang untuk"aeiou"
demi kesederhanaan (menghapus[
dan]
akan menyerahkan ke generator tanpa membuat daftar). Anda membuat banyak string perantara yang dapat dibuangattemt2
, Anda menggunakan beberapa aplikasi regex diattempt3
mana Anda dapat menggunakannyar'[aeiou]'
dalam satu pass. masing-masing memiliki kekurangan - menyenangkan untuk melihat berbagai cara untuk melakukan sesuatu, tetapi tolong perbaiki itu untuk menjadi usaha yang baik jugaInilah versi yang kompatibel dengan Python 2/3 saya. Karena api terjemahan telah berubah.
sumber
dict.fromkeys(map(ord, '!@#$'))
untuk membuat peta.map
pada umumnya kurang terbaca dari daftar / dikt / set / generator pemahaman. Sedemikian rupa sehingga Guido ingin menghapusnya dari bahasa . Menggunakannyafromkeys
juga sedikit pintar dan membutuhkan pemeriksaan dokumen.str.maketrans('', '', chars)
, yang menanganiord
konversi dandict
konstruksi semuanya sekaligus (tidak termasuk maksud yang lebih jelas, karena dirancang untuk dipasangkanstr.translate
).sumber
'
sebagai string. docs.python.org/2/library/re.htmlBagaimana dengan ini:
sumber
Anda juga dapat menggunakan fungsi untuk mengganti berbagai jenis ekspresi reguler atau pola lain dengan penggunaan daftar. Dengan itu, Anda dapat menggabungkan ekspresi reguler, kelas karakter, dan pola teks yang sangat dasar. Ini sangat berguna ketika Anda perlu mengganti banyak elemen seperti yang HTML.
* NB: bekerja dengan Python 3.x
Dalam fungsi string_cleanup, dibutuhkan string Anda x dan daftar Anda tidak diinginkan sebagai argumen. Untuk setiap item dalam daftar elemen atau pola itu, jika diperlukan pengganti, itu akan dilakukan.
Hasil:
sumber
Metode saya yang saya gunakan mungkin tidak akan bekerja seefisien, tetapi ini sangat sederhana. Saya dapat menghapus banyak karakter pada posisi yang berbeda sekaligus, menggunakan pengirisan dan pemformatan. Ini sebuah contoh:
Ini akan menghasilkan 'dihapus' memegang kata 'ini'.
Memformat bisa sangat membantu untuk mencetak variabel di tengah-tengah string cetak. Itu bisa menyisipkan tipe data apa saja menggunakan % diikuti oleh tipe data variabel; semua tipe data dapat menggunakan % s , dan mengapung (alias desimal) dan bilangan bulat dapat menggunakan % d .
Mengiris dapat digunakan untuk kontrol rumit atas string. Ketika saya menaruh kata - kata [: 3] , itu memungkinkan saya untuk memilih semua karakter dalam string dari awal (titik dua adalah sebelum angka, ini berarti 'dari awal ke') ke karakter ke-4 (termasuk ke-4 karakter). Alasan 3 sama dengan sampai posisi ke-4 adalah karena Python dimulai dari 0. Kemudian, ketika saya meletakkan kata [-1:] , itu berarti karakter terakhir ke-2 sampai akhir (titik dua berada di belakang angka). Menempatkan -1 akan membuat Python dihitung dari karakter terakhir, bukan yang pertama. Sekali lagi, Python akan mulai dari 0. Jadi, kata [-1:] pada dasarnya berarti 'dari karakter terakhir kedua hingga akhir string.
Jadi, dengan memotong karakter sebelum karakter yang ingin saya hapus dan karakter setelah dan menempelkannya bersama-sama, saya dapat menghapus karakter yang tidak diinginkan. Anggap saja seperti sosis. Di tengahnya kotor, jadi saya ingin menyingkirkannya. Saya cukup memotong dua ujung yang saya inginkan kemudian menempatkan mereka bersama tanpa bagian yang tidak diinginkan di tengah.
Jika saya ingin menghapus beberapa karakter berturut-turut, saya cukup menggeser angka-angka di dalam [] (bagian pengirisan). Atau jika saya ingin menghapus beberapa karakter dari posisi yang berbeda, saya dapat dengan mudah menyatukan beberapa irisan sekaligus.
Contoh:
dihapus sama dengan 'keren'.
dihapus sama dengan 'mac'.
Dalam hal ini, [3: 5] berarti karakter pada posisi 3 hingga karakter pada posisi 5 (tidak termasuk karakter pada posisi akhir).
Ingat, Python mulai menghitung pada 0 , jadi Anda harus melakukannya juga.
sumber
Coba yang ini:
Metode ini bekerja dengan baik di python 3.5.2
sumber
Anda dapat menggunakan penggantian ekspresi reguler modul re. Menggunakan ekspresi ^ memungkinkan Anda untuk memilih apa yang Anda inginkan dari string Anda.
Output untuk ini adalah "Thisisabsurd". Hanya hal-hal yang ditentukan setelah simbol ^ akan muncul.
sumber
Metode string
replace
tidak mengubah string asli. Ini meninggalkan aslinya dan mengembalikan salinan yang dimodifikasi.Yang Anda inginkan adalah sesuatu seperti:
line = line.replace(char,'')
Namun, membuat string baru setiap kali karakter dihapus sangat tidak efisien. Saya merekomendasikan yang berikut ini sebagai gantinya:
sumber
Di bawah satu .. tanpa menggunakan konsep ekspresi reguler ..
sumber
Dalam Python 3.5
misalnya,
Untuk menghapus semua nomor dari string
sumber
Anda bisa menggunakan set
sumber
Split rekursif: s = string; chars = chars untuk dihapus
contoh:
sumber
# untuk setiap file pada direktori, ganti nama file
sumber
Bahkan pendekatan di bawah ini berhasil
keluaran:
abcde
sumber
sumber