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 ifnot 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 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)
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 ifnot i.isdigit())>>> result
'abcd'
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 notin l:
st_res+=ch
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 notin map(str,range(0,10))else""for c in stringWithNumbers)print(stringWithoutNumbers)#I have bananas for my monkeys!
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
re
:result = re.sub(r'[0-9]+', '', s)
"\d"
ist in einem regulären Ausdruck dasselbe wie"[0-9]"
, also können Sie esresult = re.sub(r"\d+", "", s)
stattdessen tun . Die Geschwindigkeit hängt wahrscheinlich von der verwendeten Zeichenfolge ab, hat aber für michre.sub
etwa doppelt so lange gedauertstr.translate
(etwas länger, wenn Sie kein vorkompiliertes Muster verwenden).Antworten:
Würde das für Ihre Situation funktionieren?
Dies nutzt ein Listenverständnis, und was hier passiert, ähnelt dieser Struktur:
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 :):
quelle
[]
Und, um es in die Mischung zu werfen, ist das oft Vergessene,
str.translate
das viel schneller funktioniert als Looping / reguläre Ausdrücke:Für Python 2:
Für Python 3:
quelle
'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})
Sie sind sich nicht sicher, ob Ihr Lehrer die Verwendung von Filtern zulässt, aber ...
kehrt zurück-
Viel effizienter als Looping ...
Beispiel:
quelle
Was ist damit:
quelle
<filter object at 0x7f749e1745c0>
. Python3.6Nur einige (andere haben einige davon vorgeschlagen)
Methode 1:
Methode 2:
Methode 3:
Methode 4:
Methode 5:
quelle
Angenommen, st ist Ihre unformatierte Zeichenfolge, und führen Sie dann aus
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
quelle
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:
quelle
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
quelle