s = 'the brown fox'
… 여기서 뭔가 …
s
해야한다 :
'The Brown Fox'
가장 쉬운 방법은 무엇입니까?
답변
.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"
답변
이 .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"
str.split ()을 사용하여 인수를 단어로 나누고 str.capitalize ()를 사용하여 각 단어를 대문자로 바꾸고 str.join ()을 사용하여 대문자로 된 단어를 조인하십시오. 선택적 두 번째 인수 sep가 없거나 None 인 경우 공백 문자 실행이 단일 공백으로 바뀌고 선행 공백과 후행 공백이 제거되고, 그렇지 않으면 sep가 단어를 분리하고 결합하는 데 사용됩니다.
답변
이런 종류의 일이 재미있어서 여기에 두 가지 해결책이 더 있습니다.
단어로 분할하고 분할 그룹에서 각 단어를 초기 캡핑 한 다음 다시 참여하십시오. 이렇게하면 단어를 구분하는 공백이 단일 공백으로 변경됩니다.
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()
에서 사소한 처리를 수행 하여 최종 결과를 얻을 수 있습니다!
답변
여기에 여러 가지 방법이 요약되어 있습니다.이 모든 입력에 대해 작동합니다.
"" => ""
"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"
답변
@jibberia anwser의 복사하여 붙여 넣기 가능한 버전 :
def capitalize(line):
return ' '.join(s[:1].upper() + s[1:] for s in line.split(' '))
답변
솔루션이 간단하고 안전 할 때 조인 및 for 루프로 인생을 복잡하게 만드는 이유는 무엇입니까?
그냥 이렇게 :
string = "the brown fox"
string[0].upper()+string[1:]
답변
str.title ()이 효과가 없다면 대문자를 직접 사용하십시오.
- 문자열을 단어 목록으로 분할
- 각 단어의 첫 글자를 대문자로
- 단어를 하나의 문자열로 결합
짧막 한 농담:
>>> ' '.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)