문자열에서 각 단어의 첫 글자를 대문자로 바꾸는 방법은 무엇입니까?


답변:


989

.title()문자열 의 방법 (ASCII 또는 유니 코드가 좋습니다)은 다음을 수행합니다.

>>> "hello world".title()
'Hello World'
>>> u"hello world".title()
u'Hello World'

그러나 문서에 명시된대로 아포스트로피가 포함 된 문자열을 찾으십시오.

이 알고리즘은 단어의 간단한 언어 독립적 정의를 연속 문자 그룹으로 사용합니다. 정의는 많은 상황에서 작동하지만 수축과 소유주의 아포스트로피는 단어 경계를 형성하며 이는 원하는 결과가 아닐 수 있습니다.

>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"

56
내가 좋아하는 뭔가 소유격 문제를 방지" ".join(w.capitalize() for w in s.split())
mehtunguh

3
모든 단어가 대문자이기 때문에 대부분의 문자열에는 안전하지 않습니다.

10
string.title ()에 문제가 있습니다. 예를 들어을 사용 "e g 3b"하면 원하는 결과는 다음과 같습니다 "E G 3b". 그러나을 "e g 3b".title()반환합니다 "E G 3B".
Sören

7
이것 또한 이것의 원인이 될 것임을 명심하십시오 :In [2]: 'tEst'.title() Out[2]: 'Test'
Jonas Libbrecht

4
훌륭한 대답과 의견은 파이썬에서 모든 것이 필요한 방식으로 작동하는 것은 아니지만 항상 편리한 방법이 있다는 것을 강조합니다. 가장 편리한 방법은 종종 python-titlecase
Aaron3468

189

.title()방법은 잘 작동하지 않습니다.

>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"

string.capwords()방법을 사용해보십시오 .

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

capwords파이썬 문서에서 :

str.split ()을 사용하여 인수를 단어로 나누고 str.capitalize ()를 사용하여 각 단어를 대문자로 바꾸고 str.join ()을 사용하여 대문자로 된 단어를 조인하십시오. 선택적 두 번째 인수 sep가 없거나 None 인 경우 공백 문자 실행이 단일 공백으로 바뀌고 선행 공백과 후행 공백이 제거되고, 그렇지 않으면 sep가 단어를 분리하고 결합하는 데 사용됩니다.


2
Capwords는 여전히 부족하고와 같은 것을 처리하지 않습니다 "There once was a string with an 'that had words right after it and then closed'". 이 예에서는을 제외한 모든 세계 that가 예상대로 대문자로 표시됩니다. 결과는 다음과 같습니다"There Once Was A String With An 'that Had Words Right After It And Then Closed'"
devonbleibtrey

그러나 이것은 title()정상적인 상황 보다 효과적 입니다. 내 상황에서 올바르게 처리하는 title()동안 악센트 또는 디 레시 스가있는 이름의 잘못된 출력을 반환 capwords()합니다.
houcros

좋음,하지만 여전히 "영국 / UK"구분 엉망
Jonath P

104

이런 종류의 일이 재미있어서 여기에 두 가지 해결책이 더 있습니다.

단어로 분할하고 분할 그룹에서 각 단어를 초기 캡핑 한 다음 다시 참여하십시오. 이렇게하면 단어를 구분하는 공백이 단일 공백으로 변경됩니다.

s = 'the brown fox'
lst = [word[0].upper() + word[1:] for word in s.split()]
s = " ".join(lst)

편집 : 위의 코드를 작성할 때 내가 생각했던 것을 기억하지 못하지만 명시 적 목록을 작성할 필요는 없습니다. 게으른 방식으로 생성기 표현식을 사용할 수 있습니다. 더 나은 해결책은 다음과 같습니다.

s = 'the brown fox'
s = ' '.join(word[0].upper() + word[1:] for word in s.split())

정규 표현식을 사용하여 문자열의 시작 또는 공백을 구분하는 단어와 공백이 아닌 단일 문자를 일치 시키십시오. 괄호를 사용하여 "일치 그룹"을 표시하십시오. 일치 개체를 가져 와서 공백 일치 그룹을 변경하지 않고 공백이 아닌 문자 일치 그룹을 대문자로 반환하는 함수를 작성하십시오. 그런 다음 re.sub()패턴을 교체하는 데 사용 하십시오. 이것은 첫 번째 해결책의 문장 부호 문제가 없으며 첫 번째 해결책처럼 공백을 다시 만들지 않습니다. 이것이 가장 좋은 결과를 낳습니다.

import re
s = 'the brown fox'

def repl_func(m):
    """process regular expression match groups for word upper-casing problem"""
    return m.group(1) + m.group(2).upper()

s = re.sub("(^|\s)(\S)", repl_func, s)


>>> re.sub("(^|\s)(\S)", repl_func, s)
"They're Bill's Friends From The UK"

이 답변을 연구하게되어 기쁩니다. 나는 re.sub()기능 을 수행 할 수 있다는 것을 전혀 몰랐다 ! 내부 re.sub()에서 사소한 처리를 수행 하여 최종 결과를 얻을 수 있습니다!


1
슬라이스를 사용하는 솔루션의 경우 +1 나는 나머지 단어의 대문자를 바꾸지 않고 첫 글자를 대문자로 바꿀 무언가가 필요했습니다 (예 : Foo는 foo가되지만 FOO는 fOO가됩니다). 이것은 완벽했다.
TomNysetvold

1
수익을 투자의 첫 번째 문자는 대문자로 나머지는 소문자
Vanuan

@Vanuan, 당신 말이 맞아요! doc 문자열 설명은 그것이 첫 번째 문자를 대문자로 한 것이라고 생각했지만 실제로는 그 일에 대해 옳습니다. 답을 편집하겠습니다. 충고 고맙습니다.
steveha

string.capwordsChen Houwu의 답변에있는 문서에 따르면 이것이 무엇인지 나타납니다 .
Adrian Keister

1
위의 답변에서 s.split ()을 사용하는 대신 s.split ( '')을 사용하는 것이 좋습니다. 문자열에 이중 공백이있는 경우 결합시 이중 공백을 유지하려면 s.plit ( '')는 공백을 유지하는 데 도움이되지만 s.split ()은 그렇지 않습니다.
manpikin

21

여기에 여러 가지 방법이 요약되어 있습니다.이 모든 입력에 대해 작동합니다.

""           => ""       
"a b c"      => "A B C"             
"foO baR"    => "FoO BaR"      
"foo    bar" => "Foo    Bar"   
"foo's bar"  => "Foo's Bar"    
"foo's1bar"  => "Foo's1bar"    
"foo 1bar"   => "Foo 1bar"     

-가장 간단한 해결책은 문장을 단어로 나누고 첫 글자를 대문자로 한 다음 다시 결합하는 것입니다.

# Be careful with multiple spaces, and empty strings
# for empty words w[0] would cause an index error, 
# but with w[:1] we get an empty string as desired
def cap_sentence(s):
  return ' '.join(w[:1].upper() + w[1:] for w in s.split(' ')) 

-입력 문자열을 단어로 먼저 나누고 멋진 생성기를 사용하지 않으려면 :

# Iterate through each of the characters in the string and capitalize 
# the first char and any char after a blank space
from itertools import chain 
def cap_sentence(s):
  return ''.join( (c.upper() if prev == ' ' else c) for c, prev in zip(s, chain(' ', s)) )

-또는 itertools를 가져 오지 않고 :

def cap_sentence(s):
  return ''.join( (c.upper() if i == 0 or s[i-1] == ' ' else c) for i, c in enumerate(s) )

-또는 steveha의 답변 에서 정규 표현식을 사용할 수 있습니다 .

# match the beginning of the string or a space, followed by a non-space
import re
def cap_sentence(s):
  return re.sub("(^|\s)(\S)", lambda m: m.group(1) + m.group(2).upper(), s)

자, 이것들은 게시 된 다른 답변 들과 문장의 시작 부분이나 단어 뒤에 공백이있는 단어의 정의를 사용하는 경우 예상대로 작동하지 않는 입력입니다.

  return s.title()

# Undesired outputs: 
"foO baR"    => "Foo Bar"       
"foo's bar"  => "Foo'S Bar" 
"foo's1bar"  => "Foo'S1Bar"     
"foo 1bar"   => "Foo 1Bar"      

  return ' '.join(w.capitalize() for w in s.split())    
  # or
  import string
  return string.capwords(s)

# Undesired outputs:
"foO baR"    => "Foo Bar"      
"foo    bar" => "Foo Bar"      

분할에 ''를 사용하면 두 번째 출력이 수정되지만 capwords ()는 여전히 첫 번째 출력에서 ​​작동하지 않습니다.

  return ' '.join(w.capitalize() for w in s.split(' '))    
  # or
  import string
  return string.capwords(s, ' ')

# Undesired outputs:
"foO baR"    => "Foo Bar"      

여러 개의 빈 공간에주의하십시오

  return ' '.join(w[0].upper() + w[1:] for w in s.split())
# Undesired outputs:
"foo    bar" => "Foo Bar"                 

종합적인 요약을 보려면 +1 숫자를 따르는 단어 만 대문자로 표기하는 방법을 찾고 있습니다 (모든 단어가 아님). 이것을 증명하는 답변을 추가 할 수 있습니까? 예를 lower 123 upper반환해야합니다 lower 123 Upper이 곳, upper이 숫자를 다음과 같이 대문자로 표시됩니다. OP의 질문 범위를 넘어서지 만 이미 광범위한 답변에 멋진 추가 기능을 제공한다는 것을 알고 있습니다. 미리 감사드립니다.
ProGrammer

이 경우 필요에 따라 위의 방법 중 일부를 수정할 수 있습니다. 그러나 대부분의 사람들이 찾고있는 것이 아니기 때문에 대답의 일부로 추가하지 않습니다. 정규식 버전을 사용하고 "([0-9]+)(\s+.)"대신 "(^|\s)(\S)"(하나 이상의 숫자, 하나 이상의 공백 및 그 이후의 문자와 일치) 대신 또는 "([0-9]+)(\s*.)"'0 이상의 공백'뒤에 문자를 대문자로 사용하려는 경우 수
aljgom

나는 또 다른 특별한 경우에 대해 생각하게 만들 것입니다 : 위의 스 니펫을 수정하여 문자열 대신 예를 들어 WW1 - the great war출력 하는 방법은 무엇입니까 ? 약어 관련 문제를 참조하십시오? 이 사례를 보여주는 무언가를 기꺼이 추가 하시겠습니까? 나는 이것에 대해 잠시 동안 궁금해했으며 그것을 할 수있는 방법을 생각할 수 없습니다. WW1 - The Great WarWw1 ...
ProGrammer

위에서 언급 한 첫 번째 방법은 입력 문자열에서 이미 대문자로 된 문자를 변경하지 않으므로 다음 WW1과 같이 출력됩니다.WW1
aljgom

15

@jibberia anwser의 복사하여 붙여 넣기 가능한 버전 :

def capitalize(line):
    return ' '.join(s[:1].upper() + s[1:] for s in line.split(' '))

2
목록을 작성할 필요가 없습니다. str.join발전기를 받아들입니다.
warvariuc

@warvariuc 생성기를 활용하기 위해이 코드를 어떻게 변경 하시겠습니까?
Konstantin Spirin


1
@warvariuc가 joingen exp 를 받아들이는 것을 언급하는 데는 완벽하지만 , str.join특히 목록 이해를 사용하는 것이 좋습니다. 이는 join인수에 대해 두 번 반복되므로 생성기 대신 준비된 목록을 제공하는 것이 더 빠르기 때문입니다.
Bhargav Rao

1
@BhargavRao 왜 str.join논쟁을 두 번 반복해야합니까? 방금 확인했습니다. 작은 시퀀스의 경우 목록 이해가 실제로 더 빠릅니다.
warvariuc

12

솔루션이 간단하고 안전 할 때 조인 및 for 루프로 인생을 복잡하게 만드는 이유는 무엇입니까?

그냥 이렇게 :

string = "the brown fox"
string[0].upper()+string[1:]

2
여러 단어가있을 수 있기 때문입니다.
Arnaud

1
네,하지만 종종 첫 글자 만 대문자로 표기하고 싶습니다. 이것이 그렇게하는 방법입니다.
Deleet

1
그럼 그냥 사용하지 "the brown fox".capitalize()않습니까?
luckydonald

2
@luckydonald은 어쩌면 내가 설정하지 않기 때문에 'this is John''This is john'.
janek37

이 작업을 수행하는 더 좋은 방법은 아닙니다 string.capitalize()(본질적으로 @luckydonalds를 울림)
Hassan Baig

10

str.title ()이 효과가 없다면 대문자를 직접 사용하십시오.

  1. 문자열을 단어 목록으로 분할
  2. 각 단어의 첫 글자를 대문자로
  3. 단어를 하나의 문자열로 결합

짧막 한 농담:

>>> ' '.join([s[0].upper() + s[1:] for s in "they're bill's friends from the UK".split(' ')])
"They're Bill's Friends From The UK"

명확한 예 :

input = "they're bill's friends from the UK"
words = input.split(' ')
capitalized_words = []
for word in words:
    title_case_word = word[0].upper() + word[1:]
    capitalized_words.append(title_case_word)
output = ' '.join(capitalized_words)

1
이 솔루션의 한 가지 흥미로운 점은 특별한 공백을 잃는다는 것입니다. 상황에 따라 중요하지 않을 수 있습니다.
mklauber

8

첫 글자 만 원한다면 :

>>> 'hello world'.capitalize()
'Hello world'

그러나 각 단어를 대문자로 바꾸려면

>>> 'hello world'.title()
'Hello World'

주의해야 'hello New York'.capitalize()할 사항'Hello new york'
user2314737

5

[1 :]에 액세스하면 빈 문자열이 오류를 발생 시키므로 다음을 사용합니다.

def my_uppercase(title):
    if not title:
       return ''
    return title[0].upper() + title[1:]

첫 글자 만 대문자로


그게 아닌가 str.capitalize?
유진 파코 모프

4
@Eugene, 그렇지만 불행히도, 바람직하지 않은 다른 모든 문자는 소문자로 대문자로 표기하십시오. : /
Wim Feijen

return title[:1].upper() + title[1:]즉이 빈 문자열을 줄 것 같이 또한 하늘의 캐릭터를 얇게하기 때문에 그 문제 돌볼 것입니다 함께 빈 반환되는 문자열을 만들 합류
aljgom

3

Mark가 지적했듯이 다음을 사용해야합니다 .title().

"MyAwesomeString".title()

그러나 django template 안에 첫 글자를 대문자로 만들려면 다음을 사용할 수 있습니다.

{{ "MyAwesomeString"|title }}

또는 변수를 사용하여 :

{{ myvar|title }}

3

제안 된 메소드 str.title ()은 모든 경우에 작동하지 않습니다. 예를 들면 다음과 같습니다.

string = "a b 3c"
string.title()
> "A B 3C"

대신에 "A B 3c".

다음과 같이하는 것이 좋습니다.

def capitalize_words(string):
    words = string.split(" ") # just change the split(" ") method
    return ' '.join([word.capitalize() for word in words])

capitalize_words(string)
>'A B 3c'

1
이들을 분리 공간의 개수가 기준 1. 아닌 경우에는 오류가 발생할 수 hackerrank 문제
Divakar 인 Rajesh

3

모든 답변이 이미 만족 스럽지만 이전의 모든 사례와 함께 2 개의 추가 사례를 다루려고합니다.

공백이 균일하지 않고 동일하게 유지하려는 경우

string = hello    world i  am    here.

모든 문자열이 알파벳으로 시작하지 않는 경우

string = 1 w 2 r 3g

여기서 이것을 사용할 수 있습니다

def solve(s):
    a = s.split(' ')
    for i in range(len(a)):
        a[i]= a[i].capitalize()
    return ' '.join(a)

이것은 당신에게 줄 것이다

output = Hello    World I  Am    Here
output = 1 W 2 R 3g

이것이 중복되지 않기를 바랍니다.


2
비 균일 공간의 경우를 강조해 주셔서 감사합니다. 위의 일부 답변은 s.split ( '') 대신 s.split ()을 사용합니다. 비 균일 공간의 경우 s.split ( '')을 사용하면 비 균일 공간이 유지됩니다. 다시 감사합니다
manpikin

공백이 고르지 않은 단어 나 숫자로 시작하는 단어에 완벽하게 작동합니다. 감사합니다 :)
Amresh Giri

2

단어를 대문자로 사용하려면 ...

str = "this is string example....  wow!!!";
print "str.title() : ", str.title();

@ Gary02127 주석, 아포스트로피가 포함 된 솔루션 작업 제목 아래

import re

def titlecase(s):
    return re.sub(r"[A-Za-z]+('[A-Za-z]+)?", lambda mo: mo.group(0)[0].upper() + mo.group(0)[1:].lower(), s)

text = "He's an engineer, isn't he? SnippetBucket.com "
print(titlecase(text))

기존 함수를 사용하면 파이썬에서 빠르게 실행할 수 있습니다.
Tejas Tank

아포스트로피를 처리하지 않기 때문에 title ()을 좋아하지 않습니다. "나는 말할 수 없다".title ()은 "나는 말할 수 없다"
Gary02127

@ Gary02127 답변을 업데이트했습니다. 문제의 도메인과 완벽하게 작동했습니다.
Tejas Tank

1

공백 보존을 간과하지 마십시오. 당신이 처리하려는 경우 'fred flinstone'당신이 얻을 'Fred Flinstone'대신에 'Fred Flinstone', 당신은 당신의 공백을 손상했습니다. 위의 솔루션 중 일부는 공백을 잃게됩니다. 다음은 Python 2 및 3에 좋고 공백을 유지하는 솔루션입니다.

def propercase(s):
    return ''.join(map(''.capitalize, re.split(r'(\s+)', s)))

0

파이썬 3에 대한 빠른 기능

Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> capitalizeFirtChar = lambda s: s[:1].upper() + s[1:]
>>> print(capitalizeFirtChar('помните своих Предковъ. Сражайся за Правду и Справедливость!'))
Помните своих Предковъ. Сражайся за Правду и Справедливость!
>>> print(capitalizeFirtChar('хай живе вільна Україна! Хай живе Любовь поміж нас.'))
Хай живе вільна Україна! Хай живе Любовь поміж нас.
>>> print(capitalizeFirtChar('faith and Labour make Dreams come true.'))
Faith and Labour make Dreams come true.

0

균일하지 않은 공백으로 문자열을 대문자로

글쎄, 나는 이것이 오래된 질문이며 아마도 대답이 거의 소진되었을 수도 있음을 이해하지만 @Amit Gupta의 불균일 한 공간에 추가하고 싶습니다. 원래 질문에서 문자열의 모든 단어를 대문자로 사용하고 싶습니다 s = 'the brown fox'. 문자열에 s = 'the brown fox'공백이없는 경우 어떻게해야합니까?

def solve(s):
    # if you want to maintain the spaces in the string, s = 'the brown      fox'
    # use s.split(' ') instead of s.split(). 
    # s.split() returns ['the', 'brown', 'fox']
    # while s.split(' ') returns ['the', 'brown', '', '', '', '', '', 'fox']
    capitalized_word_list = [word.capitalize() for word in s.split(' ')]
    return ' '.join(capitalized_word_list)

.. 갈색과 여우 사이에 공백이 없으면 코드가 탭을 보정하지 못합니다. ;-)
ZF007

-1

** 크기를 줄이려는 경우 **

 #Assuming you are opening a new file   
 with open(input_file) as file:
     lines = [x for x in reader(file) if x]
 #for loop to parse the file by line
 for line in lines:
           name = [x.strip().lower() for x in line if x]
           print(name) #check the result

-2

나는이 대답을 정말로 좋아한다.

@jibberia anwser의 복사하여 붙여 넣기 가능한 버전 :

def capitalize(line):
    return ' '.join([s[0].upper() + s[1:] for s in line.split(' ')])

그러나 내가 보낸 일부 행은 s [1 :]을 수행하려고 할 때 오류를 일으킨 빈 ''문자를 분리했습니다. 이 작업을 수행하는 더 좋은 방법이있을 수 있지만 다음과 같이 if len (s)> 0을 추가해야합니다.

return ' '.join([s[0].upper() + s[1:] for s in line.split(' ') if len(s)>0])

2
이것은 길이를 확인하는 데 너무 복잡합니다! 무능한.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.