Menghapus nomor dari string [tertutup]

121

Bagaimana cara menghapus digit dari string?

pengguna1739954
sumber
19
Dengan re:result = re.sub(r'[0-9]+', '', s)
Wiktor Stribiżew
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 if not 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 list
for i in s:
    if not 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 if not i.isdigit())
>>> result
'abcd'
RocketDonkey
sumber
@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.
Kirk Strauser
Diperbaiki - terima kasih @ AshwiniChaudhary / @ KirkStrauser.
RocketDonkey
@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'
Jon Clements
sumber
13
Pendekatan ini tidak akan berfungsi di Python3. Lakukan sebagai gantinya: 'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})
valignatev
3
Solusi terbaik untuk Python2.
Harsh Wardhan
Tidak berfungsi untuk string karakter unicode
Harry M
20

Tidak yakin apakah guru Anda mengizinkan Anda menggunakan filter tetapi ...

filter(lambda x: x.isalpha(), "a1a2a3s3d4f5fg6h")

kembali-

'aaasdffgh'

Jauh lebih efisien daripada perulangan ...

Contoh:

for i in range(10):
  a.replace(str(i),'')
Alain Nisam
sumber
1
ia mengembalikan ini sebagai gantinya: <filter object at 0x03475FD0>
lone_coder
5

Bagaimana dengan ini:

out_string = filter(lambda c: not c.isdigit(), in_string)
Pavel Paulau
sumber
4
Outputnya adalah <filter object at 0x7f749e1745c0>. Python3.6
TitanFighter
@TitanFighter Anda dapat memaksa generator menjadi objek daftar dengan membungkus objek yang dikembalikan dari filter ke dalam daftar (filter (...))
ahlusar1989
5

Hanya sedikit (orang lain menyarankan beberapa di antaranya)

Metode 1:

''.join(i for i in myStr if not i.isdigit())

Metode 2:

def removeDigits(s):
    answer = []
    for char in s:
        if not char.isdigit():
            answer.append(char)
    return ''.join(char)

Metode 3:

''.join(filter(lambda x: not x.isdigit(), mystr))

Metode 4:

nums = set(map(int, range(10)))
''.join(i for i in mystr if i not in nums)

Metode 5:

''.join(i for i in mystr if ord(i) not in range(48, 58))
inspectorG4dget
sumber
2
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 not in l:
  st_res+=ch
iddqd
sumber
1

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 not in map(str,range(0,10)) else "" for c in stringWithNumbers)
print(stringWithoutNumbers) #I have  bananas for my  monkeys!
Sean Johnson
sumber
1

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

Baahubali
sumber
A for-loop secara otomatis melakukan iterasi melalui setiap karakter string, jadi tidak perlu memecah string menjadi beberapa karakter.
Ashwini Chaudhary