Python, kontextempfindliche String -Substitution
-
22-10-2019 - |
Frage
Ist es möglich, in Python so etwas mit regelmäßigen Ausdrücken so etwas zu tun?
Inkrementieren Sie jedes Zeichen, das eine Zahl in einer Zeichenfolge um 1 ist
Eingabe "123ab5" würde also "234AB6" werden
Ich weiß, ich könnte über die Saite iterieren und jeden Charakter manuell erhöht, wenn es sich um eine Zahl handelt, aber dies scheint unpythonisch zu sein.
Hinweis. Dies sind keine Hausaufgaben. Ich habe mein Problem bis zu einem Niveau vereinfacht, das wie eine Hausaufgabenübung klingt.
Lösung
a = "123ab5"
b = ''.join(map(lambda x: str(int(x) + 1) if x.isdigit() else x, a))
oder:
b = ''.join(str(int(x) + 1) if x.isdigit() else x for x in a)
oder:
import string
b = a.translate(string.maketrans('0123456789', '1234567890'))
In einem dieser Fälle:
# b == "234ab6"
BEARBEITEN - Die ersten beiden Karte 9
zu einem 10
, der letzte umhüllt es 0
. Um die ersten beiden in Null einzuwickeln, müssen Sie ersetzen str(int(x) + 1)
mit str((int(x) + 1) % 10)
Andere Tipps
>>> test = '123ab5'
>>> def f(x):
try:
return str(int(x)+1)
except ValueError:
return x
>>> ''.join(map(f,test))
'234ab6'
>>> a = "123ab5"
>>> def foo(n):
... try: n = int(n)+1
... except ValueError: pass
... return str(n)
...
>>> a = ''.join(map(foo, a))
>>> a
'234ab6'
Übrigens mit einem einfachen If oder mit Versuch-Catch eumiro-Lösung mit Join+Map ist die pythonischere Lösung auch für mich