Zahlen aus der Zeichenfolge entfernen [geschlossen]


120

Wie kann ich Ziffern aus einer Zeichenfolge entfernen?


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

Mit Regex müssen Sie \ hinzufügen. auch, da es eine Dezimalzahl sein kann, denke ich. wie Ergebnis = re (r '[0-9 \.] +', '', s)
GurhanCagin

1
"\d"ist in einem regulären Ausdruck dasselbe wie "[0-9]", also können Sie es result = re.sub(r"\d+", "", s)stattdessen tun . Die Geschwindigkeit hängt wahrscheinlich von der verwendeten Zeichenfolge ab, hat aber für mich re.subetwa doppelt so lange gedauert str.translate(etwas länger, wenn Sie kein vorkompiliertes Muster verwenden).
Nathan

Antworten:


184

Würde das für Ihre Situation funktionieren?

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

Dies nutzt ein Listenverständnis, und was hier passiert, ähnelt dieser Struktur:

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)

Wie @AshwiniChaudhary und @KirkStrauser hervorheben, müssen Sie die Klammern im Einzeiler nicht verwenden, sodass das Teil in den Klammern ein Generatorausdruck ist (effizienter als ein Listenverständnis). Auch wenn dies nicht den Anforderungen für Ihre Aufgabe entspricht, sollten Sie es irgendwann lesen :):

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

@ SeanJohnson Super! Ich bin sicher, dass ich das von jemand anderem auf dieser Seite gelernt habe, also ist der Zyklus abgeschlossen :)
RocketDonkey

@ RocketDonkey keine Notwendigkeit von[]
Ashwini Chaudhary

3
In Python 2.7 und höher benötigen Sie keine Klammern um das Listenverständnis. Sie können sie weglassen und es wird ein Generatorausdruck.
Kirk Strauser

Behoben - danke @ AshwiniChaudhary / @ KirkStrauser.
RocketDonkey

@RocketDonkey fügt auch eine Erklärung hinzu, nur den Code zu sehen, hilft dem OP nicht, denke ich.
Ashwini Chaudhary

97

Und, um es in die Mischung zu werfen, ist das oft Vergessene, str.translatedas viel schneller funktioniert als Looping / reguläre Ausdrücke:

Für Python 2:

from string import digits

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

Für Python 3:

from string import digits

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

13
Dieser Ansatz funktioniert in Python3 nicht. Tun Sie stattdessen: 'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})
Valignatev

3
Beste Lösung für Python2.
Harsh Wardhan

Funktioniert nicht für Unicode-Zeichenketten
Harry M

20

Sie sind sich nicht sicher, ob Ihr Lehrer die Verwendung von Filtern zulässt, aber ...

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

kehrt zurück-

'aaasdffgh'

Viel effizienter als Looping ...

Beispiel:

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

1
Stattdessen wird Folgendes zurückgegeben: <Filterobjekt bei 0x03475FD0>
lone_coder

5

Was ist damit:

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

4
Ausgabe ist <filter object at 0x7f749e1745c0>. Python3.6
TitanFighter

@TitanFighter Sie können den Generator in ein Listenobjekt zwingen, indem Sie das zurückgegebene Objekt vom Filter in die Liste (Filter (...))
einschließen

5

Nur einige (andere haben einige davon vorgeschlagen)

Methode 1:

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

Methode 2:

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

Methode 3:

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

Methode 4:

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

Methode 5:

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

2
Es würde sich lohnen, einen Effizienzvergleich zu diesen zu zeigen.
Nu Everest

2

Angenommen, st ist Ihre unformatierte Zeichenfolge, und führen Sie dann aus

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

wie oben erwähnt. Aber ich vermute, dass Sie etwas sehr Einfaches brauchen, also sagen Sie, s ist Ihre Zeichenfolge und st_res ist eine Zeichenfolge ohne Ziffern. Dann ist hier Ihr Code

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

Ich würde gerne Regex verwenden, um dies zu erreichen, aber da Sie nur Listen, Schleifen, Funktionen usw. verwenden können.

Folgendes habe ich mir ausgedacht:

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

Wenn ich Ihre Frage richtig verstehe, besteht eine Möglichkeit darin, die Zeichenfolge in Zeichen aufzuteilen und dann jedes Zeichen in dieser Zeichenfolge mithilfe einer Schleife zu überprüfen, ob es sich um eine Zeichenfolge oder eine Zahl handelt. Wenn die Zeichenfolge es dann in einer Variablen und dann in der Schleife speichert Wenn Sie fertig sind, zeigen Sie dies dem Benutzer an


Eine for-Schleife durchläuft automatisch jedes Zeichen einer Zeichenfolge, sodass die Zeichenfolge nicht in Zeichen unterteilt werden muss.
Ashwini Chaudhary
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.