Gibt es eine Standardmethode in Python eine Zeichenfolge Titlecase (das heißt Wörter mit Großbuchstaben beginnen, alle verbleibenden verrohrten Zeichen Klein haben), aber Artikel wie and
verlassen, in
und of
kleingeschrieben?Titlecasing eine Zeichenfolge mit Ausnahmen
Antwort
Es gibt ein paar Probleme. Wenn Sie split und join verwenden, werden einige Leerzeichen ignoriert. Die integrierte Groß- und Titelmethode ignoriert Leerräume nicht.
>>> 'There is a way'.title()
'There Is A Way'
Wenn ein Satz mit einem Artikel beginnt, möchten Sie nicht das erste Wort eines Titels in Kleinbuchstaben.
halten diese im Auge:
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
Es sind 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 Kleine Artikel Option. Sie müssten das selbst programmieren, wahrscheinlich indem Sie eine Liste von Artikeln verwenden, die Sie senken möchten.
titlecase.py Kleinbuchstaben Artikel. –
capitalize (word)
Dies sollte tun. Ich verstehe es anders.
>>> mytext = u'i am a foobar bazbar'
>>> mytext.capitalize()
u'I am a foobar bazbar'
>>>
Ok wie gesagt in der Antwort oben, müssen Sie eine benutzerdefinierte machen profitieren:
mytext = U'i bin 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 gibt
I am a Foobar Bazbar
Der Titel beginnt mit cap italisiertes Wort und das passt nicht zum Artikel.
Verwenden Sie das Modul titlecase.py! Funktioniert nur für Englisch.
>>> from titlecase import titlecase
>>> titlecase('i am a foobar bazbar')
'I Am a Foobar Bazbar'
Das titlecase-Modul funktioniert nicht, wenn die zu konvertierende Zeichenfolge irgendwo eine Zahl enthält. – Troy
@Troy es scheint, das Nummer Problem ist behoben, oder ich habe Ihren Rand Fall nicht getroffen. Bsp: titlecase ('eins 4 zwei') -> 'One 4 Two'. Jetzt titlecase ('1one') -> '1one', aber '1one'.title() ->' 1One '. obwohl dieser spätere Fall ein Randfall ist und ich bin nicht sicher, '1One' ist das korrekte Betiteln. Ich bin auch nicht besorgt genug, um mein Grammatikbuch zu greifen. –
Funktioniert nicht im Falle von "321 A BROADWAY STREET", wo ich "321 a Broadway Street" bekomme. Die Verwendung der oben von dheerosaurier vorgeschlagenen Lösung produziert "321 A Broadway Street". – MoreScratch
Stuart Colville has made a Python port von a Perl script written by John Gruber Strings in Titel Fall zu konvertieren, aber kleine Wörter basierend auf Regeln aus der New York Times Manual of Style, sowie Catering für mehrere Sonderfälle vermeidet Kapitalisierung .
Einige der Klugheit dieser Skripte:
sie kapitalisiert kleine Wörter wie wenn, in, der, auf usw., sondern sie un-Kapital, wenn sie fälschlicherweise aktiviert in die Eingabe.
Die Skripts gehen davon aus, dass Wörter mit Großbuchstaben außer dem ersten Zeichen bereits korrekt groß geschrieben sind. Das bedeutet, dass sie ein Wort wie "iTunes" allein lassen, anstatt es in "ITunes" oder, schlimmer noch, "Itunes" zu verfälschen.
überspringen sie alle Wörter mit Linienpunkten; "Example.com" und "del.icio.us" bleiben in Kleinbuchstaben.
sie hartcodierte hackt spezifisch mit ungerader Fällen zu behandeln, wie „& AT T“ und „Q & A“, von denen beide kleine Worte enthalten (at und A), die normalerweise klein geschrieben werden.
Das erste und das letzte Wort des Titels werden immer großgeschrieben, daher wird die Eingabe wie "Nichts, worüber man Angst haben muss" in "Nichts, vor dem man Angst haben muss" umgewandelt.
Ein kleines Wort nach einem Doppelpunkt wird großgeschrieben.
Sie können es herunterladen here.
Die Titelmethode von Python 2.7 hat einen Fehler.
value.title()
wird 'S Assistent, wenn der Wert Carpenter ist' Carpenter Rückkehr
Die beste Lösung s Assistant ist wahrscheinlich derjenige von @BioGeek von Stuart Colville mit Titlecase. Welches ist die gleiche Lösung von @Etienne vorgeschlagen.
One-liner Liste Verständnis verwendet 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 für die Schleife ein (in der Liste comprehenstion)
word.title() if word not in "the a on in of an" else word
verwendet die systemeigene Methode title()
, um die Zeichenfolge zu betiteln, wenn es sich nicht um einen Artikel handelt
" ".join
verbindet die Listenelemente mit einem Trennzeichen von (Leerzeichen)
+1 für den "Satz, der mit einem Artikel beginnt" Fall – yassin
Warum ist 're 'notwendig? Es gibt eine '" ".split" -Funktion, die das Gleiche tut. – wizzwizz4
@ wizzwizz4: 'str.split' berücksichtigt keine zusammenhängenden Leerzeichen. 're.split' behält Leerzeichen. Diese Funktion verbraucht also keine Leerzeichen. – dheerosaur