Sayıları dizeden çıkarma [kapalı]


122

Bir dizeden basamakları nasıl kaldırabilirim?


19
İle re:result = re.sub(r'[0-9]+', '', s)
Wiktor Stribiżew

normal ifadeyle \ eklemeniz gerekir. ayrıca, ondalık sayı olabileceği gibi düşünüyorum. benzer sonuç = re.sub (r '[0-9 \.] +', '', s)
GürhanCagin

1
"\d"bir normal ifadede ile aynıdır "[0-9]", yani result = re.sub(r"\d+", "", s)bunun yerine yapabilirsiniz . Hız muhtemelen kullanılan dizgeye bağlı olacaktır, ancak benim için re.subiki kat daha uzun sürdü str.translate(önceden derlenmiş bir desen kullanmazsanız biraz daha uzun).
Nathan

Yanıtlar:


186

Bu durumunuz için işe yarar mı?

>>> s = '12abcd405'
>>> result = ''.join([i for i in s if not i.isdigit()])
>>> result
'abcd'

Bu, bir liste anlayışından yararlanır ve burada olanlar şu yapıya benzer:

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)

@AshwiniChaudhary ve @KirkStrauser'ın da belirttiği gibi, aslında tek satırdaki parantezleri kullanmanıza gerek yok, bu da parantez içindeki parçayı bir üreteç ifadesi haline getiriyor (liste anlayışından daha verimli). Bu, ödevinizin gereksinimlerine uymasa bile, sonunda okumanız gereken bir şey :):

>>> s = '12abcd405'
>>> result = ''.join(i for i in s if not i.isdigit())
>>> result
'abcd'

@SeanJohnson Harika! Bunu bu sitedeki başka birinden öğrendiğime eminim, yani döngü tamamlandı :)
RocketDonkey

@RocketDonkey no need of[]
Ashwini Chaudhary

3
Python 2.7 ve üzeri sürümlerde, listeyi anlama etrafında köşeli parantezlere ihtiyacınız yoktur. Onları dışarıda bırakabilirsiniz ve bu bir üreteç ifadesi haline gelir.
Kirk Strauser

Düzeltildi - teşekkürler @ AshwiniChaudhary / @ KirkStrauser.
RocketDonkey

@RocketDonkey de bazı açıklamalar ekliyor, sadece kodu görmek OP'ye yardımcı olmayacağını tahmin ediyorum.
Ashwini Chaudhary

98

Ve bunu karışıma atmak, str.translatedöngü / normal ifadelerden çok daha hızlı çalışacak olan çoğu zaman unutulan şeydir :

Python 2 için:

from string import digits

s = 'abc123def456ghi789zero0'
res = s.translate(None, digits)
# 'abcdefghizero'

Python 3 için:

from string import digits

s = 'abc123def456ghi789zero0'
remove_digits = str.maketrans('', '', digits)
res = s.translate(remove_digits)
# 'abcdefghizero'

13
Bu yaklaşım Python3'te çalışmayacaktır. Bunun yerine yapın: 'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})
valignatev

3
Python2 için en iyi çözüm.
Harsh Wardhan

Unicode karakter dizeleri için çalışmıyor
Harry M

20

Öğretmenin filtre kullanmana izin verip vermediğinden emin değilim ama ...

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

İadeler-

'aaasdffgh'

Döngüden çok daha verimli ...

Misal:

for i in range(10):
  a.replace(str(i),'')

1
bunun yerine şunu döndürür: <0x03475FD0 adresindeki filtre nesnesi>
lone_coder

5

Peki buna ne dersin:

out_string = filter(lambda c: not c.isdigit(), in_string)

4
Çıktı <filter object at 0x7f749e1745c0>. Python3.6
TitanFighter

@TitanFighter Filtreden döndürülen nesneyi listeye sararak üreteci bir liste nesnesine
zorlayabilirsiniz

5

Sadece birkaçı (diğerleri bunlardan bazılarını önerdi)

Yöntem 1:

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

Yöntem 2:

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

Yöntem 3:

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

Yöntem 4:

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

Yöntem 5:

''.join(i for i in mystr if ord(i) not in range(48, 58))

2
Bunlar üzerinde verimlilik karşılaştırması göstermeye değer.
nu everest

2

St biçimlendirilmemiş dizginiz olduğunu söyleyin, sonra çalıştırın

st_nodigits=''.join(i for i in st if i.isalpha())

yukarıda belirtildiği gibi. Ama tahminimce çok basit bir şeye ihtiyacınız var , diyelim ki s sizin dizeniz ve st_res rakamsız bir dizge, o zaman işte kodunuz

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

1

Bunu başarmak için normal ifadeyi kullanmayı çok isterim, ancak yalnızca listeleri, döngüleri, işlevleri vb. Kullanabildiğiniz için.

işte bulduğum şey:

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!

1

Sorunuzu doğru anlarsam, yapmanın bir yolu dizeyi karakterlere ayırmak ve ardından bu dizedeki her bir karakteri bir döngü kullanarak bir dize veya sayı olup olmadığını ve ardından dizenin bir değişkene kaydedip kaydetmediğini kontrol etmektir. bitti, bunu kullanıcıya göster


Bir for-loop, bir dizenin her karakterini otomatik olarak yineler, böylece dizeyi karakterlere ayırmaya gerek yoktur.
Ashwini Chaudhary
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.