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
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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.
Method 2
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'
Method 3
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
Method 4
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
Method 5
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"
Method 6
a one-liner: ' '.join(sub[:1].upper() + sub[1:] for sub in text.split(' '))
Method 7
You can replace the first letter (preceded by a digit) of each word using regex:
re.sub(r'(dw)', lambda w: w.group().upper(), '1bob 5sandy') output: 1Bob 5Sandy
Method 8
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
Method 9
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
Method 10
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
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0