Titlecasing eine Zeichenkette mit Ausnahmen
-
03-10-2019 - |
Frage
Gibt es eine Standardmethode in Python eine Zeichenfolge (das heißt Wörter mit Großbuchstaben beginnen, alle verbleibenden verrohrten Zeichen Klein haben) zu Titlecase aber Artikel wie and
, in
und of
klein geschrieben verlassen?
Lösung
Es gibt ein paar Probleme. Wenn Sie Split verwenden und kommen, werden einige Leerzeichen ignoriert werden. Der eingebaute in Kapital und Titel Methoden nicht Leerraum ignorieren.
>>> 'There is a way'.title()
'There Is A Way'
Wenn ein Satz beginnt mit einem Artikel, Sie möchten nicht das erste Wort eines Titels in Kleinbuchstaben.
Wenn man sich diese im Sinne:
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
Andere Tipps
Mit dem titlecase.py Modul! Funktioniert nur für Englisch.
>>> from titlecase import titlecase
>>> titlecase('i am a foobar bazbar')
'I Am a Foobar Bazbar'
Es gibt diese Methoden:
>>> mytext = u'i am a foobar bazbar'
>>> print mytext.capitalize()
I am a foobar bazbar
>>> print mytext.title()
I Am A Foobar Bazbar
Es gibt keine Kleinen Artikel Option. Sie würden zu Code haben, dass sich, wahrscheinlich durch eine Liste von Artikeln verwenden Sie senken möchten.
Stuart Colville hat eine Python-Port gemacht von ein Perl-Skript von John Gruber geschrieben Strings in Titel Fall vermeidet aber konvertieren Kapitalisierung kleine Worte basierend auf Regeln aus der New York Times Manual of Style, sowie Catering für mehrere Sonderfälle.
Einige der Klugheit dieser Skripte:
-
sie kapitalisiert kleine Wörter wie , wenn in, der, auf , etc., aber Wille un-kapitalisieren sie, wenn sie in den Eingang fälschlicherweise aktiviert sind.
-
Die Skripte, die Wörter mit Großbuchstaben anders als das erste Zeichen übernehmen sind bereits korrekt aktiviert. Dies bedeutet, dass sie ein Wort wie „iTunes“ in Ruhe lassen, anstatt es in „ITunes“ Mangeln oder, schlimmer noch, „Itunes“.
-
sie alle Wörter mit Zeilen Punkten überspringen; „Example.com“ und „del.icio.us“ wird Klein bleiben.
-
Sie haben speziell hartcodierte Hacks mit ungeraden Fälle zu behandeln, wie „AT & T“ und „Q & A“, die beide die kleinen Wörter enthalten (bei und a) die normalerweise klein geschrieben werden sollte.
-
Das erste und letztes Wort des Titels ist immer aktiviert, so Eingang wie „Nichts zu fürchten“ wird in gedreht werden „Nichts zu befürchten“.
-
Ein kleines Wort nach einem Doppelpunkt aktiviert werden.
Sie können es herunterladen hier .
capitalize (word)
sollte dies tun. Ich bekomme es anders.
>>> mytext = u'i am a foobar bazbar'
>>> mytext.capitalize()
u'I am a foobar bazbar'
>>>
Ok sagte als Antwort oben, müssen Sie eine benutzerdefinierte machen profitieren:
mytext = U'i Uhr ein 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)
Diese Ausgänge
I am a Foobar Bazbar
Python 2.7 Titel Methode hat einen Fehler in ihm.
value.title()
wird Carpenter zurückkehren ' S Assistent wenn der Wert Carpenter' s Assistent
Die beste Lösung ist wahrscheinlich derjenige von @BioGeek mit Titlecase von Stuart Colville. Das ist die gleiche Lösung von @Etienne vorgeschlagen.
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
"""
Der Titel beginnt mit aktivierten Wort und den Artikel nicht überein.
Einzeiler mit Liste Verständnis und den ternären Operator
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)
Aufteilung:
for word in "Wow, a python one liner for titles".split(" ")
Splits die Zeichenfolge in eine Liste und leitet eine for-Schleife (in der Liste comprehenstion)
word.title() if word not in "the a on in of an" else word
verwendet native Methode title()
zum Titel Fall der Zeichenfolge, wenn es nicht ein Artikel ist
" ".join
verbindet die Listenelemente mit einem seperator von (Leerzeichen)