wake-up-neo.com

Einen String mit Ausnahmen betiteln

Gibt es in Python) eine Standardmethode, um einen String mit einem Titel zu versehen (dh Wörter beginnen mit Großbuchstaben, alle verbleibenden Großbuchstaben haben Kleinbuchstaben), wobei jedoch Artikel wie and, in und of in Kleinbuchstaben?

85
yassin

Es gibt ein paar Probleme damit. Wenn Sie split and join verwenden, werden einige Leerzeichen ignoriert. Bei den integrierten Methoden capitalize und title werden Leerzeichen nicht ignoriert.

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

Wenn ein Satz mit einem Artikel beginnt, soll das erste Wort eines Titels nicht in Kleinbuchstaben geschrieben werden.

Beachten Sie dabei Folgendes:

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

Verwenden Sie das titlecase.py Modul! Funktioniert nur für Englisch.

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

GitHub: https://github.com/ppannuto/python-titlecase

47
Etienne

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 Option für Artikel in Kleinbuchstaben. Sie müssten das selbst codieren, wahrscheinlich mithilfe einer Liste von Artikeln, die Sie senken möchten.

20
nosklo

Stuart Colville hat einen Python port aus einem von John Gruber geschriebenen Perl-Skript gemacht, um Zeichenfolgen in Groß- und Kleinschreibung umzuwandeln, vermeidet jedoch die Groß- und Kleinschreibung von Wörtern auf Regeln aus dem New York Times Manual des Stils, sowie Verpflegung für mehrere Sonderfälle.

Einige der Klugheit dieser Skripte:

  • sie schreiben kleine Wörter wie , wenn, in, von, auf , usw. in Großbuchstaben, deaktivieren sie jedoch, wenn sie bei der Eingabe fälschlicherweise in Großbuchstaben geschrieben werden.

  • in den Skripten wird davon ausgegangen, dass Wörter mit anderen Großbuchstaben als dem ersten Zeichen bereits korrekt groß geschrieben sind. Dies bedeutet, dass sie ein Wort wie "iTunes" in Ruhe lassen, anstatt es in "iTunes" oder, schlimmer noch, "iTunes" zu zerlegen.

  • sie überspringen Wörter mit Strichpunkten; "Example.com" und "del.icio.us" bleiben in Kleinbuchstaben.

  • sie haben hartcodierte Hacks speziell für Sonderfälle wie „AT & T“ und „Q & A“. Beide enthalten kleine Wörter (at und a), die normalerweise in Kleinbuchstaben geschrieben werden sollten.

  • Das erste und das letzte Wort des Titels werden immer in Großbuchstaben geschrieben, sodass Eingaben wie "Nichts, vor dem man Angst haben muss" in "Nichts, vor dem man Angst haben muss" umgewandelt werden.

  • Ein kleines Wort nach einem Doppelpunkt wird großgeschrieben.

Sie können es herunterladen hier .

12
BioGeek
capitalize (Word)

Das sollte reichen. Ich verstehe es anders.

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

Ok, wie oben in der Antwort erwähnt, müssen Sie eine benutzerdefinierte Großschreibung vornehmen:

mytext = Ich bin ein Trottel

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)   

Dies gibt aus

I am a Foobar Bazbar
4
pyfunc

Die Titelmethode von Python 2.7 weist einen Fehler auf.

value.title()

gibt Carpenter ' [~ # ~] s [~ # ~] Assistent zurück, wenn der Wert Carpenter' s Assistent

Die beste Lösung ist wahrscheinlich die von @BioGeek mit dem titlecase von Stuart Colville. Welches ist die gleiche Lösung von @Etienne vorgeschlagen.

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
"""

Der Titel beginnt mit Großbuchstaben und stimmt nicht mit dem Artikel überein.

1

Einzeilig mit Listenverständnis und dem 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)

Aufschlüsselung:

for Word in "Wow, a python one liner for titles".split(" ") Teilt den String in eine Liste und initiiert eine for-Schleife (im Listenverständnis)

Word.title() if Word not in "the a on in of an" else Word verwendet die native Methode title(), um die Zeichenfolge in Groß- und Kleinschreibung zu bezeichnen, wenn es sich nicht um einen Artikel handelt

" ".join Verbindet die Listenelemente mit einem Trennzeichen von (Leerzeichen)

1
user7297223