web-dev-qa-db-fra.com

Titrer une chaîne avec des exceptions

Existe-t-il une méthode standard dans Python) pour titlecase une chaîne (les mots commencent par des majuscules, tous les caractères en casse restants sont en minuscule) mais en laissant des articles tels que and, in, et of en minuscule?

85
yassin

Cela pose quelques problèmes. Si vous utilisez scinder et joindre, certains caractères d’espace seront ignorés. Les méthodes intégrées capitalize et title n'ignorent pas les espaces.

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

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

Gardant cela à 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 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

Utilisez le module 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

47
Etienne

Il y a 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 d'option d'article minuscule. Vous devrez le coder vous-même, probablement en utilisant une liste d'articles que vous souhaitez réduire.

20
nosklo

Stuart Colville a créé un Python) sur n script Perl écrit par John Gruber pour convertir les chaînes en majuscules mais évite de capitaliser les petits mots sur les règles de style du New York Times Manual, ainsi que pour répondre à plusieurs cas particuliers.

Un peu de l'intelligence de ces scripts:

  • ils capitalisent les petits mots tels que si, dans, sur, sur , etc., mais ne les capitalisent pas s’ils sont capitalisés à tort dans l’entrée.

  • les scripts supposent que les mots avec des lettres majuscules autres que le premier caractère le sont déjà correctement. Cela signifie qu'ils laisseront un mot comme "iTunes" seul, plutôt que de le transformer en "iTunes" ou, pire, "iTunes".

  • ils sautent tous les mots avec des points. “Exemple.com” et “del.icio.us” resteront en minuscules.

  • ils ont des codes rigides spécialement conçus pour traiter les cas impairs, tels que "AT & T" et "Q & A", qui contiennent tous deux de petits mots (at et a) qui devraient normalement être en minuscule.

  • Le premier et le dernier mot du titre sont toujours en majuscule; les entrées telles que "Rien à craindre" seront transformées en "Rien à craindre".

  • Un petit mot après un colon sera mis en majuscule.

Vous pouvez le télécharger ici .

12
BioGeek
capitalize (Word)

Cela devrait faire. Je comprends les choses différemment.

>>> 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 majuscule personnalisée:

mon texte = 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)   

Cette sortie

I am a Foobar Bazbar
4
pyfunc

La méthode title de Python 2.7 présente une faille.

value.title()

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

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

Le titre commence par Word en majuscule et cela ne correspond pas à l'article.

1
Tony Veijalainen

One-Liner utilisant la compréhension de 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)

Ventilation:

for Word in "Wow, a python one liner for titles".split(" ") divise la chaîne en une liste et lance une boucle for (dans la compréhension de la liste)

Word.title() if Word not in "the a on in of an" else Word utilise la méthode native title() pour titrer la chaîne si ce n'est pas un article

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

1
user7297223