web-dev-qa-db-ja.com

文字列の各Wordの最初の文字を大文字にする方法(Python)

s = 'the brown fox'

...何かここで.

sは次のようになります。

'The Brown Fox'

これを行う最も簡単な方法は何ですか?

486
TIMEX

文字列の .title() メソッド(ASCIIまたはUnicodeのどちらでも構いません)はこれを行います。

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

ただし、ドキュメントに記載されているように、埋め込まれたアポストロフィを含む文字列を探してください。

このアルゴリズムは、言語の独立した単純なWordの定義を連続した文字のグループとして使用します。この定義は多くの文脈で機能しますが、収縮や所有物のアポストロフィが単語の境界を形成することを意味します。これは望ましい結果ではないかもしれません。

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

.title() メソッドはうまく動きません、

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

string.capwords() methodを試してください。

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

Capwordsの pythonドキュメントから

Str.split()を使用して引数を単語に分割し、str.capitalize()を使用して各Wordを大文字にし、str.join()を使用して大文字にした単語を結合します。オプションの2番目の引数sepが存在しないかNoneの場合、空白文字のランは単一のスペースに置き換えられ、先頭と末尾の空白は削除されます。それ以外の場合、sepは単語の分割と結合に使用されます。

170
Chen Houwu

この種のことが私にとって楽しいからといって、もう2つ解決策があります。

単語に分割し、分割されたグループから各単語を頭に付け、そして再結合します。これにより、単語を区切っている空白が1つの空白に変わります。

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

文字列の先頭、または単語を区切る空白文字と単一の空白文字以外の文字を一致させるには、正規表現を使用します。 "match groups"をマークするには括弧を使用してください。一致オブジェクトを受け取り、空白の一致グループを変更せずに、空白以外の文字の一致グループを大文字で返す関数を作成します。それから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()の中で自明でない処理をして最終結果を出すことができます!

92
steveha

コピー&ペースト対応バージョンの@jibberia anwser:

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

これを実行するためのさまざまな方法の要約です。これらはすべての入力に対して機能します。

""           => ""       
"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's answer :から正規表現を使うこともできます。

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

さて、これらは投稿されたいくつかの 他の答え であり、私たちがWordの定義を文の先頭にしたり、空白の後に何かを使用している場合は期待通りに動作しません

  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"      

分割に ''を使用すると、2番目の出力は修正されますが、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"                 
13
aljgom

解決策がシンプルで安全なのに、なぜ結合やforループであなたの生活を複雑にするのですか?

これをしてください。

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

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

[1:]にアクセスした場合、空の文字列でエラーが発生します。したがって、次のように使用します。

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

最初の文字だけを大文字にします。

5
Wim Feijen

Markが指摘したように、 .title() :を使うべきです。

"MyAwesomeString".title()

ただし、最初の文字を大文字のDjangoテンプレート内にする場合は、次のようにします。

{{ "MyAwesomeString"|title }}

または変数を使用する:

{{ myvar|title }}
3
chuckfinley

単語を大文字にするには.

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))
2
Tejas Tank

推奨されているメソッド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
Sören

余白の保存を見逃さないでください。 'fred flinstone'を処理したいときに、'Fred Flinstone'の代わりに'Fred Flinstone'を受け取った場合は、空白が壊れています。上記の解決策のいくつかは空白を失います。これはPython 2と3に適した解決策で、空白を保持します。

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

あなただけが最初の文字が欲しいなら: 'hello world' .capitalize()出力:Hello world

しかし、それぞれのWordを大文字にするために: 'hello world'。title()出力:Hello world

1
Zahran

**小型化したい場合**

 #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
0
Fouad Djebbar