Python schreibt nur den ersten Buchstaben groß

177

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
user1442957
quelle

Antworten:

233

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'
Ali Afshar
quelle
5
und das ist, was diese Antwort tut, so ziemlich
njzk2
16
Ich würde verwenden, wenn c.isalpha () anstatt wenn nicht c.isdigit ()
njzk2
1
@ Jan-PhilipGehrcke das ist eine Übung für den Leser. Sie können in diesem Fall sehen, s ist nie leer, es ist immer '123sa': D
Ali Afshar
2
@ Jan-PhilipGehrcke: In diesem Fall next((i for i,e in enumerate(test) if not e.isdigit()), '0')löst es für den leeren String-Fall
njzk2
5
Diese Antwort ist nicht korrekt. . capitalizeverwandelt 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
Großbuchstaben
245

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.

DSM
quelle
38

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

pinkwerks
quelle
2
Sehr nützlich, braucht aber einen len(x) == 0Zweig.
Xan
seit python 2.5 kann der leere return x[0].upper() + x[1:] if len(x) > 0 else x
fall
Sehr nützliche Antwort, da capitalize& titlezuerst die gesamte Zeichenfolge in Kleinbuchstaben und dann nur den ersten Buchstaben in Großbuchstaben schreibt.
Jonas Libbrecht
4
Nützlich. Verwenden Sie einfach a[:1].upper() + a[1:], dies wird sich um den len(X)==0Eckfall kümmern .
Normanius
1
Gute Arbeit, aber in diesem Fall nicht funktionieren, da diese Funktion nur das erste Zeichen groß schreibt und das erste Zeichen eine Ziffer ist, kein Text. In diesem Fall müssen Sie vor der Verwendung die Zahlen und Ziffern teilen und das Ergebnis verbinden.
GeoStoneMarten
13

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

Anon
quelle
4

Wie hier von Chen Houwu beantwortet, ist es möglich, ein String-Paket zu verwenden:

import string
string.capwords("they're bill's friends from the UK")
>>>"They're Bill's Friends From The Uk"
Fábio
quelle
1

Ich habe mir das ausgedacht:

import re

regex = re.compile("[A-Za-z]") # find a alpha
str = "1st str"
s = regex.search(str).group() # find the first alpha
str = str.replace(s, s.upper(), 1) # replace only 1 instance
print str
Prasanth
quelle
1

Sie können den ersten Buchstaben ( preceded by a digit) jedes Wortes mit Regex ersetzen :

re.sub(r'(\d\w)', lambda w: w.group().upper(), '1bob 5sandy')

output:
 1Bob 5Sandy
Kenly
quelle
1

ein Einzeiler: ' '.join(sub[:1].upper() + sub[1:] for sub in text.split(' '))

Gürol Canbek
quelle
Ich denke du meinst das, nicht wahr? '' .join (sub [: 1] .upper () + sub [1:] für sub in text.split (''))
Michael
Korrigiert. Danke @Michael
Gürol Canbek