Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Hallo,
also ich lese Datein bzw. Ordner-Namen ein. Diese haben in etwa das Format "ABC E1", es sind aber auch welche dabei die z.B. so aussehen "ABC E01_F" und so weiter.
Unterm Strich bleibt, ich habe Strings in denen Zahlen auftauchen, manche mit führender 0 wenn sie kleiner 10 sind und manche ohne. Ich möchte dass in diesen Strings alle Zahlen kleiner 10 eine führende 0 haben.
Ich hab schon befürchtet, dass ich da wohl nicht im Regular Expression drumherumkomme...
import string
def format_name(name):
out = []
prev_is_digit = False
for character in name:
if character in string.digits[1:] and not prev_is_digit and out:
out.append('0')
out.append(character)
prev_is_digit = character in string.digits
name = ''.join(out)
try:
if name[0] in string.digits and name[1] not in string.digits:
name = "0%s" % name
except IndexError:
pass
return name
if __name__ == '__main__':
# simple test
for s in ('E3b', 'E03b', 'E13b', 'ABC E1', 'ABC E01', '1ABC E012',
'12ABC', '0123ABC'):
print s, format_name(s)
@mutetella: Das ``if`` sollte man sich sparen können wenn man ein Muster angibt das keine leeren Treffer erzeugt: r'\d+'. (Die Klammern sind auch nicht nötig.)
voriges kein digit und nächstes ein digit auf das kein digit oder Ende folgt
Folglich stehe ich beim Beispiel 'p1next' auf dem 'n'. Wie kommt es, dass 'sub' vor die '1' (oder hinter dem 'p') ein '0' einfügt? Warum fügt 'sub' überhaupt etwas ein?
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
@Sirius3: Schönes Beispiel für look-behind und non-consuming look-ahead (hatte ich zuvor aus dem Stegreif nicht parat). IMHO eignet sich das Problem auch prima als Übungsaufgabe unter Einsatz von regex sowie ohne. Werde ich mir merken.
voriges kein digit und nächstes ein digit auf das kein digit oder Ende folgt
Folglich stehe ich beim Beispiel 'p1next' auf dem 'n'. Wie kommt es, dass 'sub' vor die '1' (oder hinter dem 'p') ein '0' einfügt? Warum fügt 'sub' überhaupt etwas ein?
mutetella
@mutetella: Du hast den regulären Ausdruck schon richtig übersetzt. Er sucht die Position im String, an der
zuvor keine Ziffer steht und eine Ziffer und dann keine Ziffer folgt. Der eigentliche Suchtext ist aber leer.
Bei Deinem Beispiel stehst Du zwischen p und 1n und ersetzt das Nichts dazwichen durch eine 0 -> p01n.
Leider bedeutet \D 'ein Zeichen das keine Ziffer ist', so das ich sowohl auf keine Ziffer als auch auf Stringende
prüfen muss.