回答:
.title()
文字列のメソッド(ASCIIまたはUnicodeのどちらでもかまいません)はこれを行います。
>>> "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()を使用して大文字の単語を結合します。オプションの2番目の引数sepがないかNoneの場合、一連の空白文字は1つのスペースに置き換えられ、先頭と末尾の空白が削除されます。それ以外の場合は、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()
は正しく処理されていても、正しくない出力が返されます。
このようなことが私にとって楽しいからといって、次の2つの解決策があります。
単語に分割し、分割されたグループから各単語の頭文字を大文字にして、再び参加します。これにより、単語を区切る空白が、何であっても単一の空白に変更されます。
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
陳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"
分割に ''を使用すると、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"
lower 123 upper
返されます。私はそれがOPの質問の範囲を超えていることを知っていますが、あなたのすでに広範囲な答えへの素晴らしいアドオンです。前もって感謝します。lower 123 Upper
upper
"([0-9]+)(\s+.)"
代わりに使用します"(^|\s)(\S)"
(1つ以上の数字、1つ以上のスペース、その後に任意の文字が続く)、または "([0-9]+)(\s*.)"
「ゼロ以上の」スペースの後の文字を大文字にしたい場合番号
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 exps を受け入れることを言及するのに最適ですが、str.join
特に場合には、リスト内包表記を使用することが一般的に推奨されます。これはjoin
、引数に対して2回繰り返されるため、ジェネレーターではなく、すぐに使えるリストを提供する方が速いためです。
str.join
引数を2回繰り返す必要があるのでしょうか?確認したところ、チェックしていません。小さなシーケンスのリストの理解は確かに高速ですが。
ソリューションがシンプルで安全なのに、結合とforループで生活を複雑にしているのはなぜですか?
これを行うだけです:
string = "the brown fox"
string[0].upper()+string[1:]
"the brown fox".capitalize()
か?
'this is John'
に'This is john'
。
string.capitalize()
(本質的に@luckydonaldをエコーします)
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:]
そのように空の文字列をスライスすると2つの空の文字列が得られ、結合して空の文字列が作成されるため、この問題にも対処できます
推奨されるメソッド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))
Python 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)
私はこの答えが本当に好きです:
@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())