파이썬은 첫 글자 만 대문자


179

.capitalize ()가 문자열의 첫 문자를 대문자로 인식하지만 첫 문자가 정수이면 어떻게됩니까?

1bob
5sandy

이에

1Bob
5Sandy

답변:


234

첫 번째 문자가 정수이면 첫 번째 문자를 대문자로하지 않습니다.

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

기능을 원하면 숫자를 제거하고 '2'.isdigit()각 문자를 확인 하는 데 사용할 수 있습니다 .

>>> s = '123sa'
>>> for i, c in enumerate(s):
...     if not c.isdigit():
...         break
... 
>>> s[:i] + s[i:].capitalize()
'123Sa'

5
이것이
바로이

16
나는) 경우 c.isalpha ()보다는 그렇지 않은 경우 c.isdigit를 (사용합니다
njzk2

1
독자를위한 @ Jan-PhilipGehrcke 이 경우에 볼 수 있습니다. s는 비어 있지 않으며 항상 '123sa'입니다. : D
Ali Afshar

2
@ Jan-PhilipGehrcke :이 경우 next((i for i,e in enumerate(test) if not e.isdigit()), '0')빈 문자열 케이스를 해결합니다
njzk2

5
이 답변은 정확하지 않습니다. . capitalize다른 문자를 더 낮게 변환합니다. 공식 문서에서 : "S의 제목이 지정된 버전을 반환합니다. 즉, 단어는 제목이 대문자로 시작하고 나머지모두 소문자가됩니다. "
karantan

246

다른 사람이 언급하지 않았기 때문에 :

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

그러나 이것은 또한

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

즉, 그것은 단지 첫 알파벳 문자를 대문자로하지 않습니다. 그러나 .capitalize()적어도 그 점에서 같은 문제가 'joe Bob'.capitalize() == 'Joe bob'있습니다.


38

이것은 re 모듈이 필요없이 문자열의 나머지 부분을 그대로 유지한다는 점에서 @Anon의 대답과 유사합니다.

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

@Xan이 지적했듯이 함수는 더 많은 오류 검사를 사용할 수 있습니다 (예 : x가 시퀀스인지 확인하지만 기술을 설명하기 위해 가장자리를 생략합니다)

@normanius 의견마다 업데이트되었습니다 (감사합니다!)

@GeoStoneMarten 덕분에 질문에 대답하지 않았습니다. 고정


2
매우 유용하지만 len(x) == 0분기가 필요합니다 .
Xan

파이썬 2.5부터 빈 케이스는 한 줄로 처리 할 수 ​​있습니다 : return x[0].upper() + x[1:] if len(x) > 0 else x
danio

capitalize& title전체 문자열을 소문자로 한 다음 첫 문자 만 대문자로 사용 하므로 매우 유용한 답변 입니다.
Jonas Libbrecht

5
유능한. 을 사용 a[:1].upper() + a[1:]하면 len(X)==0코너 케이스가 처리됩니다.
normanius

1
이 기능은 첫 번째 caracter 만 대문자로 사용하고 le first caracter는 텍스트가 아닌 숫자이므로 잘 작동하지만이 경우에는 작동하지 않습니다. 이 경우 사용하기 전에 숫자와 숫자를 나누고 결과를 결합해야합니다.
GeoStoneMarten

13

다음은 첫 글자를 대문자로 한 모든 후속 글자의 경우를 남기는 하나의 라이너입니다.

import re

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

결과는 WordsWithOtherUppercaseLetters


4

보는 것처럼 여기 첸 Houwu 응답, 그것은 사용 문자열 패키지로 가능합니다 :

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

1

나는 이것을 생각해 냈다.

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

preceded by a digit정규식을 사용하여 각 단어 의 첫 글자 ( )를 바꿀 수 있습니다 .

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

output:
 1Bob 5Sandy

1

원 라이너 : ' '.join(sub[:1].upper() + sub[1:] for sub in text.split(' '))


나는 당신이 이것을 의미하지 않는다고 생각합니까? ''.join (sub [: 1] .upper () + sub [1 :] in text.split ( ''))의 하위
Michael

수정했습니다. 감사합니다 @Michael
Gürol Canbek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.