dengan regex Anda perlu menambahkan \. juga, karena bisa berupa angka desimal menurut saya. seperti result = re.sub (r '[0-9 \.] +', '', s)
GurhanCagin
1
"\d"sama di regex sebagai "[0-9]", jadi Anda bisa melakukannya result = re.sub(r"\d+", "", s). Kecepatan mungkin akan tergantung pada string tertentu yang digunakan, tetapi bagi saya, re.submemakan waktu sekitar dua kali lebih lama str.translate(sedikit lebih lama jika Anda tidak menggunakan pola yang telah dikompilasi sebelumnya).
Nathan
Jawaban:
185
Apakah ini akan berhasil untuk situasi Anda?
>>> s ='12abcd405'>>> result =''.join([i for i in s ifnot i.isdigit()])>>> result
'abcd'
Ini menggunakan pemahaman daftar, dan apa yang terjadi di sini mirip dengan struktur ini:
no_digits =[]# Iterate through the string, adding non-numbers to the no_digits listfor i in s:ifnot i.isdigit():
no_digits.append(i)# Now join all elements of the list with '', # which puts all of the characters together.
result =''.join(no_digits)
Seperti yang ditunjukkan oleh @AshwiniChaudary dan @KirkStrauser, Anda sebenarnya tidak perlu menggunakan tanda kurung dalam satu baris, membuat bagian di dalam tanda kurung menjadi ekspresi generator (lebih efisien daripada pemahaman daftar). Meskipun ini tidak sesuai dengan persyaratan untuk tugas Anda, itu adalah sesuatu yang pada akhirnya harus Anda baca :):
>>> s ='12abcd405'>>> result =''.join(i for i in s ifnot i.isdigit())>>> result
'abcd'
@SeanJohnson Luar Biasa! Saya yakin saya mempelajarinya dari orang lain di situs ini, jadi siklusnya selesai :)
RocketDonkey
@RocketDonkey tidak perlu[]
Ashwini Chaudhary
3
Di Python 2.7 dan yang lebih baru, Anda tidak memerlukan tanda kurung di sekitar pemahaman daftar. Anda dapat membiarkannya keluar dan itu menjadi ekspresi generator.
@RocketDonkey menambahkan beberapa penjelasan juga, hanya melihat kode tidak akan membantu OP saya kira.
Ashwini Chaudhary
98
Dan, hanya untuk memasukkannya ke dalam campuran, adalah yang sering dilupakan str.translateyang akan bekerja jauh lebih cepat daripada ekspresi reguler / perulangan:
Untuk Python 2:
from string import digits
s ='abc123def456ghi789zero0'
res = s.translate(None, digits)# 'abcdefghizero'
Untuk Python 3:
from string import digits
s ='abc123def456ghi789zero0'
remove_digits = str.maketrans('','', digits)
res = s.translate(remove_digits)# 'abcdefghizero'
Akan bermanfaat untuk menunjukkan perbandingan efisiensi pada ini.
nu everest
2
Katakanlah st adalah string Anda yang belum diformat, lalu jalankan
st_nodigits=''.join(i for i in st if i.isalpha())
seperti disebutkan di atas. Tapi tebakan saya Anda membutuhkan sesuatu yang sangat sederhana jadi katakan s adalah string Anda dan st_res adalah string tanpa digit, maka ini kode Anda
l =['0','1','2','3','4','5','6','7','8','9']
st_res=""for ch in s:if ch notin l:
st_res+=ch
Saya ingin menggunakan regex untuk melakukannya, tetapi karena Anda hanya dapat menggunakan daftar, loop, fungsi, dll ..
inilah yang saya dapatkan:
stringWithNumbers="I have 10 bananas for my 5 monkeys!"
stringWithoutNumbers=''.join(c if c notin map(str,range(0,10))else""for c in stringWithNumbers)print(stringWithoutNumbers)#I have bananas for my monkeys!
Jika saya mengerti pertanyaan Anda dengan benar, salah satu cara yang harus dilakukan adalah memecah string dalam karakter dan kemudian memeriksa setiap karakter dalam string itu menggunakan loop apakah itu string atau angka dan kemudian jika string menyimpannya dalam variabel dan kemudian sekali loop selesai, tampilkan itu kepada pengguna
re
:result = re.sub(r'[0-9]+', '', s)
"\d"
sama di regex sebagai"[0-9]"
, jadi Anda bisa melakukannyaresult = re.sub(r"\d+", "", s)
. Kecepatan mungkin akan tergantung pada string tertentu yang digunakan, tetapi bagi saya,re.sub
memakan waktu sekitar dua kali lebih lamastr.translate
(sedikit lebih lama jika Anda tidak menggunakan pola yang telah dikompilasi sebelumnya).Jawaban:
Apakah ini akan berhasil untuk situasi Anda?
Ini menggunakan pemahaman daftar, dan apa yang terjadi di sini mirip dengan struktur ini:
Seperti yang ditunjukkan oleh @AshwiniChaudary dan @KirkStrauser, Anda sebenarnya tidak perlu menggunakan tanda kurung dalam satu baris, membuat bagian di dalam tanda kurung menjadi ekspresi generator (lebih efisien daripada pemahaman daftar). Meskipun ini tidak sesuai dengan persyaratan untuk tugas Anda, itu adalah sesuatu yang pada akhirnya harus Anda baca :):
sumber
[]
Dan, hanya untuk memasukkannya ke dalam campuran, adalah yang sering dilupakan
str.translate
yang akan bekerja jauh lebih cepat daripada ekspresi reguler / perulangan:Untuk Python 2:
Untuk Python 3:
sumber
'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})
Tidak yakin apakah guru Anda mengizinkan Anda menggunakan filter tetapi ...
kembali-
Jauh lebih efisien daripada perulangan ...
Contoh:
sumber
Bagaimana dengan ini:
sumber
<filter object at 0x7f749e1745c0>
. Python3.6Hanya sedikit (orang lain menyarankan beberapa di antaranya)
Metode 1:
Metode 2:
Metode 3:
Metode 4:
Metode 5:
sumber
Katakanlah st adalah string Anda yang belum diformat, lalu jalankan
seperti disebutkan di atas. Tapi tebakan saya Anda membutuhkan sesuatu yang sangat sederhana jadi katakan s adalah string Anda dan st_res adalah string tanpa digit, maka ini kode Anda
sumber
Saya ingin menggunakan regex untuk melakukannya, tetapi karena Anda hanya dapat menggunakan daftar, loop, fungsi, dll ..
inilah yang saya dapatkan:
sumber
Jika saya mengerti pertanyaan Anda dengan benar, salah satu cara yang harus dilakukan adalah memecah string dalam karakter dan kemudian memeriksa setiap karakter dalam string itu menggunakan loop apakah itu string atau angka dan kemudian jika string menyimpannya dalam variabel dan kemudian sekali loop selesai, tampilkan itu kepada pengguna
sumber