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

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'

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.


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


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


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"

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

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

1

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.