Question

Y at-il un moyen standard en Python pour TitleCase une chaîne (à savoir les mots commençant par des caractères majuscules, tous les caractères restants ont tubé en minuscules), mais en laissant des articles comme and, in et of en minuscules?

Était-ce utile?

La solution

Il y a quelques problèmes avec cela. Si vous utilisez split et join, certains caractères blancs seront ignorés. Le capitalisent intégré et méthodes de titre n'ignorent pas d'espace blanc.

>>> 'There     is a way'.title()
'There     Is A Way'

Si une phrase commence par un article, vous ne voulez pas le premier mot d'un titre en minuscule.

Garder à l'esprit ces:

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

Autres conseils

Utilisez le titlecase.py ! Fonctionne uniquement pour l'anglais.

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

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

Il existe des méthodes suivantes:

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

Il n'y a pas d'option de l'article minuscule. Il faudrait que le code vous-même, probablement à l'aide d'une liste d'articles que vous voulez réduire.

Stuart Colville a fait un port Python de un script Perl écrit par John Gruber pour convertir des chaînes en cas de titre, mais évite capitalisant petits mots sur la base des règles du New York Times Manuel de style, ainsi que la restauration pour plusieurs cas particuliers.

Une partie de l'intelligence de ces scripts:

  • ils capitalise petits mots comme si, en, de, sur , etc., mais les non-capitaliser si elles sont à tort capitalisées dans l'entrée.

  • les scripts supposent que les mots avec des lettres majuscules autres que le premier caractère sont déjà capitalisés correctement. Cela signifie qu'ils laisser un mot comme « iTunes » seul, plutôt que mutiler dans « ITunes » ou, pire encore, « iTunes ».

  • ils sautent sur des mots avec des points de ligne; « Example.com » et « del.icio.us » reste minuscule.

  • ils ont hacks codés en dur spécifiquement pour traiter les cas bizarres, comme « AT & T » et « Q & A », toutes deux contiennent de petits mots (à et a) qui devrait normalement être en minuscule.

  • Le premier et le dernier mot du titre sont toujours en majuscules, entrée si tel que « Rien à craindre » sera transformé en « Rien à craindre ».

  • Un petit mot après deux points sera capitalisé.

Vous pouvez télécharger .

capitalize (word)

Cela devrait faire. Je reçois différemment.

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

Ok comme dit en réponse ci-dessus, vous devez faire une coutume capitalise:

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)   

sorties

I am a Foobar Bazbar

La méthode de titre de Python 2.7 a une faille en elle.

value.title()

retournera Carpenter ' S Assistant lorsque la valeur est Carpenter' s Assistant

La meilleure solution est probablement celle de @BioGeek en utilisant titlecase de Stuart Colville. Quelle est la même solution proposée par @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
"""

Le titre commence avec mot en majuscule et qui ne correspond pas à l'article.

Un-liner en utilisant la compréhension de la liste et l'opérateur ternaire

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)

Répartition:

for word in "Wow, a python one liner for titles".split(" ") fractionne la chaîne dans une liste et initie une boucle (dans la liste comprehenstion)

word.title() if word not in "the a on in of an" else word utilise la méthode title() native à l'autre titre de la chaîne si ce n'est pas un article

" ".join relie les éléments de la liste avec un séparateur de (espace)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top