development

문자열에서 각 단어의 첫 글자를 대문자로 바꾸는 방법 (Python)?

big-blog 2020. 2. 11. 22:33
반응형

문자열에서 각 단어의 첫 글자를 대문자로 바꾸는 방법 (Python)?


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"

capwords파이썬 문서에서 :

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 ()이 효과가 없다면 대문자를 직접 사용하십시오.

  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 :]에 액세스하면 빈 문자열이 오류를 발생 시키므로 다음을 사용합니다.

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

첫 글자 만 대문자로


첫 글자 만 원한다면 :

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

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

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

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

"MyAwesomeString".title()

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

{{ "MyAwesomeString"|title }}

또는 변수를 사용하여 :

{{ myvar|title }}

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

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))

제안 된 메소드 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'

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

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

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

 #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])

참고 URL : https://stackoverflow.com/questions/1549641/how-to-capitalize-the-first-letter-of-each-word-in-a-string-python



반응형