Mir ist bekannt, dass .capitalize () den ersten Buchstaben einer Zeichenfolge großschreibt, aber was ist, wenn das erste Zeichen eine Ganzzahl ist?
Dies
1bob
5sandy
dazu
1Bob
5Sandy
Mir ist bekannt, dass .capitalize () den ersten Buchstaben einer Zeichenfolge großschreibt, aber was ist, wenn das erste Zeichen eine Ganzzahl ist?
Dies
1bob
5sandy
dazu
1Bob
5Sandy
Antworten:
Wenn das erste Zeichen eine Ganzzahl ist, wird der erste Buchstabe nicht groß geschrieben.
>>> '2s'.capitalize()
'2s'
Wenn Sie die Funktionalität wünschen, entfernen Sie die Ziffern, mit denen Sie '2'.isdigit()
nach jedem Zeichen suchen können .
>>> s = '123sa'
>>> for i, c in enumerate(s):
... if not c.isdigit():
... break
...
>>> s[:i] + s[i:].capitalize()
'123Sa'
next((i for i,e in enumerate(test) if not e.isdigit()), '0')
löst es für den leeren String-Fall
. capitalize
verwandelt auch andere Zeichen in niedriger. Aus offiziellen Dokumenten: "Geben Sie eine Titelversion von S zurück, dh Wörter beginnen mit Groß- und Kleinschreibung, alle verbleibenden
Nur weil es sonst niemand erwähnt hat:
>>> 'bob'.title()
'Bob'
>>> 'sandy'.title()
'Sandy'
>>> '1bob'.title()
'1Bob'
>>> '1sandy'.title()
'1Sandy'
Dies würde jedoch auch geben
>>> '1bob sandy'.title()
'1Bob Sandy'
>>> '1JoeBob'.title()
'1Joebob'
dh es wird nicht nur das erste alphabetische Zeichen großgeschrieben. Aber dann .capitalize()
hat das gleiche Problem, zumindest darin 'joe Bob'.capitalize() == 'Joe bob'
, also meh.
Dies ähnelt der Antwort von @ Anon dahingehend, dass der Rest des Strings der Zeichenfolge intakt bleibt, ohne dass das Modul re erforderlich ist.
def sliceindex(x):
i = 0
for c in x:
if c.isalpha():
i = i + 1
return i
i = i + 1
def upperfirst(x):
i = sliceindex(x)
return x[:i].upper() + x[i:]
x = '0thisIsCamelCase'
y = upperfirst(x)
print(y)
# 0ThisIsCamelCase
Wie @Xan hervorhob, könnte die Funktion mehr Fehlerprüfungen verwenden (z. B. die Überprüfung, ob x eine Sequenz ist - ich lasse jedoch Randfälle weg, um die Technik zu veranschaulichen).
Aktualisiert per @normanius Kommentar (danke!)
Dank @GeoStoneMarten für den Hinweis, dass ich die Frage nicht beantwortet habe! -fixed das
len(x) == 0
Zweig.
return x[0].upper() + x[1:] if len(x) > 0 else x
capitalize
& title
zuerst die gesamte Zeichenfolge in Kleinbuchstaben und dann nur den ersten Buchstaben in Großbuchstaben schreibt.
a[:1].upper() + a[1:]
, dies wird sich um den len(X)==0
Eckfall kümmern .
Hier ist ein Einzeiler, der den ersten Buchstaben in Großbuchstaben schreibt und den Fall aller nachfolgenden Buchstaben hinterlässt:
import re
key = 'wordsWithOtherUppercaseLetters'
key = re.sub('([a-zA-Z])', lambda x: x.groups()[0].upper(), key, 1)
print key
Dies führt zu WordsWithOtherUppercaseLetters
ein Einzeiler: ' '.join(sub[:1].upper() + sub[1:] for sub in text.split(' '))