web-dev-qa-db-ja.com

例外を含む文字列のタイトル付け

Pythonに文字列のタイトルケース(つまり、単語は大文字で始まり、残りの大文字と小文字はすべて小文字になります)に、andin、およびofは小文字ですか?

85
yassin

これにはいくつかの問題があります。分割と結合を使用する場合、空白文字の一部は無視されます。組み込みの大文字と小文字を区別するメソッドは、空白を無視しません。

>>> '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
144
dheerosaur

titlecase.py モジュールを使用してください!英語でのみ動作します。

>>> from titlecase import titlecase
>>> titlecase('i am a foobar bazbar')
'I Am a Foobar Bazbar'

GitHub: https://github.com/ppannuto/python-titlecase

47
Etienne

これらの方法があります:

>>> mytext = u'i am a foobar bazbar'
>>> print mytext.capitalize()
I am a foobar bazbar
>>> print mytext.title()
I Am A Foobar Bazbar

小文字の記事オプションはありません。おそらくあなたが下げたい記事のリストを使用することによって、あなた自身でそれをコーディングしなければなりません。

20
nosklo

Stuart ColvilleはPython port of John Gruberによって書かれたPerlスクリプト を作成し、文字列をタイトルケースに変換しますが、小さな単語ベースの大文字化を回避しますスタイルのニューヨークタイムズマニュアルの規則に加えて、いくつかの特別なケースに対応しています。

これらのスクリプトの巧妙さの一部:

  • if、in、of、onなどの小さな単語を大文字にしますが、入力で誤って大文字を使用した場合は大文字を削除します。

  • スクリプトは、最初の文字以外の大文字が大文字の単語はすでに正しく大文字になっていると想定しています。これは、「iTunes」や、さらに悪いことに「iTunes」に変換するのではなく、「iTunes」のようなWordだけを残すことを意味します。

  • 行ドットのある単語はスキップします。 「example.com」と「del.icio.us」は小文字のままです。

  • 「AT&T」や「Q&A」などの奇妙なケースに対処するためにハードコードされたハックがあり、どちらも通常小文字である必要のある小さな単語(atとa)を含んでいます。

  • タイトルの最初と最後の単語は常に大文字であるため、「恐れることはない」などの入力は「恐れることはない」に変換されます。

  • コロンの後の小さな単語は大文字になります。

ダウンロードできます こちら

12
BioGeek
capitalize (Word)

これでいいはずです。私はそれを別の方法で取得します。

>>> mytext = u'i am a foobar bazbar'
>>> mytext.capitalize()
u'I am a foobar bazbar'
>>>

上記の返信で述べたように、カスタム大文字を作成する必要があります:

mytext = u'i am a 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
4
pyfunc

Python 2.7のtitleメソッドには欠陥があります。

value.title()

値がCarpenterの場合、Carpenter '[〜#〜] s [〜#〜] Assistantを返しますs Assistant

最適なソリューションは、おそらくStuart Colvilleのタイトルケースを使用した@BioGeekのソリューションです。 @Etienneが提案したのと同じソリューションです。

2
boatcoder
 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
"""

タイトルは大文字のWordで始まり、記事と一致しません。

1

リスト内包表記と三項演算子を使用したワンライナー

_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(" ")文字列をリストに分割し、forループを開始します(リスト内で)

Word.title() if Word not in "the a on in of an" else Wordは、ネイティブメソッドtitle()を使用して、記事ではない場合に文字列のタイトルを付けます

_" ".join_は、リスト要素を(スペース)の区切り文字で結合します

1
user7297223