197

I am aware .capitalize() capitalizes the first letter of a string but what if the first character is a integer?

this

1bob
5sandy

to this

1Bob
5Sandy
smci
  • 26,085
  • 16
  • 96
  • 138
user1442957
  • 5,495
  • 5
  • 19
  • 18

10 Answers10

264

Only because no one else has mentioned it:

>>> 'bob'.title()
'Bob'
>>> 'sandy'.title()
'Sandy'
>>> '1bob'.title()
'1Bob'
>>> '1sandy'.title()
'1Sandy'

However, this would also give

>>> '1bob sandy'.title()
'1Bob Sandy'
>>> '1JoeBob'.title()
'1Joebob'

i.e. it doesn't just capitalize the first alphabetic character. But then .capitalize() has the same issue, at least in that 'joe Bob'.capitalize() == 'Joe bob', so meh.

DSM
  • 291,791
  • 56
  • 521
  • 443
250

If the first character is an integer, it will not capitalize the first letter.

>>> '2s'.capitalize()
'2s'

If you want the functionality, strip off the digits, you can use '2'.isdigit() to check for each character.

>>> s = '123sa'
>>> for i, c in enumerate(s):
...     if not c.isdigit():
...         break
... 
>>> s[:i] + s[i:].capitalize()
'123Sa'
Ali Afshar
  • 38,455
  • 12
  • 89
  • 108
40

This is similar to @Anon's answer in that it keeps the rest of the string's case intact, without the need for the re module.

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

As @Xan pointed out, the function could use more error checking (such as checking that x is a sequence - however I'm omitting edge cases to illustrate the technique)

Updated per @normanius comment (thanks!)

Thanks to @GeoStoneMarten in pointing out I didn't answer the question! -fixed that

pinkwerks
  • 556
  • 4
  • 8
  • 2
    Very useful, but needs a `len(x) == 0` branch. – Xan Sep 13 '15 at 21:07
  • since python 2.5 the empty case can still be handled on one line: `return x[0].upper() + x[1:] if len(x) > 0 else x` – danio Jun 13 '16 at 10:25
  • Very useful answer, because `capitalize` & `title` first lowercase the whole string and then uppercase only the first letter. – Jonas Libbrecht Nov 14 '16 at 10:16
  • 7
    Useful. Just use `a[:1].upper() + a[1:]`, this will take care of the `len(X)==0` corner case. – normanius Mar 16 '18 at 09:47
  • 1
    Good job but don't work for this case because this function capitalize only first caracter and le first caracter is digit not text. You need split numeric and digit before use and join result in this case. – GeoStoneMarten Apr 25 '18 at 10:10
16

Here is a one-liner that will uppercase the first letter and leave the case of all subsequent letters:

import re

key = 'wordsWithOtherUppercaseLetters'
key = re.sub('([a-zA-Z])', lambda x: x.groups()[0].upper(), key, 1)
print key

This will result in WordsWithOtherUppercaseLetters

Anon
  • 169
  • 1
  • 2
4

As seeing here answered by Chen Houwu, it's possible to use string package:

import string
string.capwords("they're bill's friends from the UK")
>>>"They're Bill's Friends From The Uk"
Community
  • 1
  • 1
Fábio
  • 672
  • 2
  • 12
  • 22
2

a one-liner: ' '.join(sub[:1].upper() + sub[1:] for sub in text.split(' '))

Gürol Canbek
  • 819
  • 1
  • 11
  • 18
1

I came up with this:

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
  • 5,019
  • 2
  • 24
  • 57
1

You can replace the first letter (preceded by a digit) of each word using regex:

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

output:
 1Bob 5Sandy
Kenly
  • 16,220
  • 5
  • 36
  • 52
1
def solve(s):
    for i in s[:].split():
        s = s.replace(i, i.capitalize())
    return s

This is the actual code for work. .title() will not work at '12name' case

0
def solve(s):

names = list(s.split(" "))
return " ".join([i.capitalize() for i in names])

Takes a input like your name: john doe

Returns the first letter capitalized.(if first character is a number, then no capitalization occurs)

works for any name length