質問
Python で文字列をタイトルケースにする標準的な方法はありますか (つまり、単語は大文字で始まり、残りの大文字と小文字はすべて小文字になります)が、次のような記事が残ります and
, in
, 、 そして of
小文字?
解決
これにはいくつかの問題があります。 Splitと結合を使用すると、一部のホワイトスペース文字は無視されます。内蔵の大文字とタイトルの方法は、空白を無視しません。
>>> 'There is a way'.title()
'There Is A Way'
文が記事から始まる場合、小文字の最初のタイトルの単語は必要ありません。
これらを念頭に置いてください:
import re
def title_except(s, exceptions):
word_list = re.split(' ', s) # re.split behaves as expected
final = [word_list[0].capitalize()]
for word in word_list[1:]:
final.append(word if word in exceptions else word.capitalize())
return " ".join(final)
articles = ['a', 'an', 'of', 'the', 'is']
print title_except('there is a way', articles)
# There is a Way
print title_except('a whim of an elephant', articles)
# A Whim of an Elephant
他のヒント
使用 titlecase.py モジュール!英語のみで機能します。
>>> from titlecase import titlecase
>>> titlecase('i am a foobar bazbar')
'I Am a Foobar Bazbar'
これらの方法があります:
>>> mytext = u'i am a foobar bazbar'
>>> print mytext.capitalize()
I am a foobar bazbar
>>> print mytext.title()
I Am A Foobar Bazbar
小文字の記事オプションはありません。おそらく、下げたい記事のリストを使用して、自分でコーディングする必要があります。
Stuart Colville が Python ポートを作成しました の John Gruber によって書かれた Perl スクリプト 文字列をタイトルケースに変換しますが、ニューヨークタイムズのスタイルマニュアルの規則に基づいて小さな単語の大文字化を回避し、いくつかの特殊なケースに対応します。
これらのスクリプトの賢さのいくつかは次のとおりです。
彼らは次のような小さな単語を大文字にします もし、中で、の、の場合, などですが、入力内で誤って大文字が使用されている場合は、大文字が解除されます。
スクリプトでは、最初の文字以外が大文字になっている単語はすでに正しく大文字になっていると想定されます。これは、「iTunes」のような単語を「ITunes」またはさらに悪いことに「Itunes」に分割するのではなく、そのまま残すことを意味します。
点線のある単語はスキップされます。「example.com」と「del.icio.us」は小文字のままになります。
「AT&T」や「Q&A」など、通常は小文字であるべき短い単語 (at と a) が含まれる、奇妙なケースに対処するために特別にハードコーディングされたハックがあります。
タイトルの最初と最後の単語は常に大文字になるため、「Nothing to be Afraid Of」などの入力は「Nothing to Be Afraid Of」になります。
コロンの後の短い単語は大文字になります。
ダウンロードできます ここ.
capitalize (word)
これはすべきです。私はそれを違った方法で得ます。
>>> mytext = u'i am a foobar bazbar'
>>> mytext.capitalize()
u'I am a foobar bazbar'
>>>
上記の返信で述べたように、あなたはカスタムキャピタルを作成する必要があります:
mytext = u'iはfoobar bazbar 'です
def xcaptilize(word):
skipList = ['a', 'an', 'the', 'am']
if word not in skipList:
return word.capitalize()
return word
k = mytext.split(" ")
l = map(xcaptilize, k)
print " ".join(l)
これは出力されます
I am a Foobar Bazbar
Python 2.7のタイトルメソッドには欠陥があります。
value.title()
大工を返します」s 価値が大工のときのアシスタント」s アシスタント
最良のソリューションは、おそらくStuart ColvilleのTitleCaseを使用した@BioGeekのソリューションです。これは、@etienneによって提案されたのと同じソリューションです。
not_these = ['a','the', 'of']
thestring = 'the secret of a disappointed programmer'
print ' '.join(word
if word in not_these
else word.title()
for word in thestring.capitalize().split(' '))
"""Output:
The Secret of a Disappointed Programmer
"""
タイトルは大文字の単語で始まり、記事と一致しません。
リスト理解と三元演算子を使用したワンライナー
reslt = " ".join([word.title() if word not in "the a on in of an" else word for word in "Wow, a python one liner for titles".split(" ")])
print(reslt)
壊す:
for word in "Wow, a python one liner for titles".split(" ")
文字列をリストに分割し、ループを使用します(リストの概念)
word.title() if word not in "the a on in of an" else word
ネイティブメソッドを使用します title()
記事ではない場合は、文字列をタイトルケースにする
" ".join
(スペース)の分離剤でリスト要素に結合する