Titlecasing une chaîne avec des exceptions
-
03-10-2019 - |
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?
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'
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é.
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)