94 votes

Python Titlecase une Chaîne avec des exceptions

Est-il un moyen standard de Python pour titlecase une chaîne de caractères (par exemple les mots de commencer avec des caractères en majuscules, tout en restant enfermés les personnages ont en minuscules), mais en laissant les articles et comme mis en minuscule?

158voto

dheerosaur Points 4143

Il y a un peu de problèmes avec cela. Si vous utilisez split et join, certains espaces blancs caractères seront ignorés. Le haut-capitaliser et le titre ne peut pas ignorer les espaces blancs.

>>> '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 minuscules.

Gardant présentes à l'esprit:

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 in exceptions and word or 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

63voto

Etienne Points 6176

L'utilisation de la titlecase.py module! Ne fonctionne que pour l'anglais.

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

24voto

nosklo Points 75862

Il y a de ces méthodes:

>>> 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 de minuscules article option. Vous avez le code que vous-même, probablement en utilisant une liste d'articles que vous voulez à la baisse.

15voto

BioGeek Points 3724

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

Certains de l'intelligence de ces scripts:

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

  • les scripts de supposer que des mots avec des lettres en majuscule autre que le premier caractère sont déjà correctement capitalisées. Cela signifie qu'ils vont laisser un mot comme "iTunes" seul, plutôt que d'amputation dans "ITunes" ou, pire, "Itunes".

  • ils ignorer tous les mots avec la ligne de points; "example.com" et "del.icio.nous" reste en minuscules.

  • ils ont codé en dur hacks spécifiquement pour traiter étrange cas, comme "AT&T" et "Q&A", qui contiennent tous des petits mots (et) qui, normalement, doivent être en minuscules.

  • Le premier et le dernier mot du titre sont toujours en majuscule, de sorte que l'entrée comme "Rien à craindre" sera transformé en "Rien à Craindre".

  • Un petit mot après un deux-points seront capitalisés.

Vous pouvez le télécharger ici.

4voto

pyfunc Points 31088
capitalize (word)

Cela devrait le faire. - Je l'obtenir autrement.

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

Ok comme dit dans la réponse ci-dessus, vous devez faire une coutume de tirer profit:

mytext = u i suis un 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)   

Ce sorties

I am a Foobar Bazbar

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X