답변:
.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"
"e g 3b"
하면 원하는 결과는 다음과 같습니다 "E G 3b"
. 그러나을 "e g 3b".title()
반환합니다 "E G 3B"
.
In [2]: 'tEst'.title() Out[2]: 'Test'
이 .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가 단어를 분리하고 결합하는 데 사용됩니다.
"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'"
title()
정상적인 상황 보다 효과적 입니다. 내 상황에서 올바르게 처리하는 title()
동안 악센트 또는 디 레시 스가있는 이름의 잘못된 출력을 반환 capwords()
합니다.
이런 종류의 일이 재미있어서 여기에 두 가지 해결책이 더 있습니다.
단어로 분할하고 분할 그룹에서 각 단어를 초기 캡핑 한 다음 다시 참여하십시오. 이렇게하면 단어를 구분하는 공백이 단일 공백으로 변경됩니다.
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()
에서 사소한 처리를 수행 하여 최종 결과를 얻을 수 있습니다!
string.capwords
Chen Houwu의 답변에있는 문서에 따르면 이것이 무엇인지 나타납니다 .
여기에 여러 가지 방법이 요약되어 있습니다.이 모든 입력에 대해 작동합니다.
"" => ""
"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"
lower 123 upper
반환해야합니다 lower 123 Upper
이 곳, upper
이 숫자를 다음과 같이 대문자로 표시됩니다. OP의 질문 범위를 넘어서지 만 이미 광범위한 답변에 멋진 추가 기능을 제공한다는 것을 알고 있습니다. 미리 감사드립니다.
"([0-9]+)(\s+.)"
대신 "(^|\s)(\S)"
(하나 이상의 숫자, 하나 이상의 공백 및 그 이후의 문자와 일치) 대신 또는 "([0-9]+)(\s*.)"
'0 이상의 공백'뒤에 문자를 대문자로 사용하려는 경우 수
WW1 - the great war
출력 하는 방법은 무엇입니까 ? 약어 관련 문제를 참조하십시오? 이 사례를 보여주는 무언가를 기꺼이 추가 하시겠습니까? 나는 이것에 대해 잠시 동안 궁금해했으며 그것을 할 수있는 방법을 생각할 수 없습니다. WW1 - The Great War
Ww1 ...
WW1
과 같이 출력됩니다.WW1
@jibberia anwser의 복사하여 붙여 넣기 가능한 버전 :
def capitalize(line):
return ' '.join(s[:1].upper() + s[1:] for s in line.split(' '))
str.join
발전기를 받아들입니다.
join
gen exp 를 받아들이는 것을 언급하는 데는 완벽하지만 , str.join
특히 목록 이해를 사용하는 것이 좋습니다. 이는 join
인수에 대해 두 번 반복되므로 생성기 대신 준비된 목록을 제공하는 것이 더 빠르기 때문입니다.
str.join
논쟁을 두 번 반복해야합니까? 방금 확인했습니다. 작은 시퀀스의 경우 목록 이해가 실제로 더 빠릅니다.
솔루션이 간단하고 안전 할 때 조인 및 for 루프로 인생을 복잡하게 만드는 이유는 무엇입니까?
그냥 이렇게 :
string = "the brown fox"
string[0].upper()+string[1:]
"the brown fox".capitalize()
않습니까?
'this is John'
로 'This is john'
.
string.capitalize()
(본질적으로 @luckydonalds를 울림)
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)
첫 글자 만 원한다면 :
>>> 'hello world'.capitalize()
'Hello world'
그러나 각 단어를 대문자로 바꾸려면
>>> 'hello world'.title()
'Hello World'
'hello New York'.capitalize()
할 사항'Hello new york'
[1 :]에 액세스하면 빈 문자열이 오류를 발생 시키므로 다음을 사용합니다.
def my_uppercase(title):
if not title:
return ''
return title[0].upper() + title[1:]
첫 글자 만 대문자로
str.capitalize
?
return title[:1].upper() + title[1:]
즉이 빈 문자열을 줄 것 같이 또한 하늘의 캐릭터를 얇게하기 때문에 그 문제 돌볼 것입니다 함께 빈 반환되는 문자열을 만들 합류
제안 된 메소드 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'
모든 답변이 이미 만족 스럽지만 이전의 모든 사례와 함께 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
이것이 중복되지 않기를 바랍니다.
단어를 대문자로 사용하려면 ...
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))
파이썬 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.
균일하지 않은 공백으로 문자열을 대문자로
글쎄, 나는 이것이 오래된 질문이며 아마도 대답이 거의 소진되었을 수도 있음을 이해하지만 @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)
** 크기를 줄이려는 경우 **
#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
나는이 대답을 정말로 좋아한다.
@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])
" ".join(w.capitalize() for w in s.split())