s = 'the brown fox'
...doe hier iets...
s
moet zijn :
'The Brown Fox'
Wat's de gemakkelijkste manier om dit te doen?
De .title()
methode van een string (ASCII of Unicode is prima) doet dit:
>>> "hello world".title()
'Hello World'
>>> u"hello world".title()
u'Hello World'
Kijk echter uit voor strings met ingesloten apostrofs, zoals opgemerkt in de docs.
Het algoritme gebruikt een eenvoudige taalonafhankelijke definitie van een woord als groepen opeenvolgende letters. Deze definitie werkt in veel contexten, maar het betekent dat apostrofs in samentrekkingen en bezittelijke voornaamwoorden woordgrenzen vormen, wat misschien niet het gewenste resultaat is:
"they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"
Gewoon omdat dit soort dingen leuk voor me is, hier zijn nog twee oplossingen.
Splits in woorden, initialiseer elk woord uit de gesplitste groepen, en voeg weer samen. Dit zal de witruimte tussen de woorden veranderen in een enkele witruimte, ongeacht wat het was.
s = 'the brown fox'
lst = [word[0].upper() + word[1:] for word in s.split()]
s = " ".join(lst)
EDIT: Ik weet niet meer wat ik dacht toen ik de bovenstaande code schreef, maar het is niet nodig om een expliciete lijst te maken; we kunnen een generator expressie gebruiken om het op een luie manier te doen. Dus hier is een betere oplossing:
s = 'the brown fox'
s = ' '.join(word[0].upper() + word[1:] for word in s.split())
Gebruik een reguliere expressie om te matchen met het begin van de string, of witruimte tussen woorden, plus een enkel niet-witruimte teken; gebruik haakjes om "match groepen" te markeren. Schrijf een functie die een match object neemt, en geeft de white space match groep onveranderd terug en de non-whitespace karakter match groep in hoofdletters. Gebruik dan re.sub()
om de patronen te vervangen. Deze oplossing heeft niet de interpunctie problemen van de eerste oplossing, en het doet ook niet de witte ruimte opnieuw zoals mijn eerste oplossing. Deze geeft het beste resultaat.
import re
s = 'the brown fox'
def repl_func(m):
"""process regular expression match groups for word upper-casing problem"""
return m.group(1) + m.group(2).upper()
s = re.sub("(^|\s)(\S)", repl_func, s)
>>> re.sub("(^|\s)(\S)", repl_func, s)
"They're Bill's Friends From The UK"
Ik'ben blij dat ik dit antwoord heb onderzocht. Ik had geen idee dat re.sub()
een functie kon aannemen! Je kunt niet-triviale bewerkingen uitvoeren binnen re.sub()
om het eindresultaat te produceren!
Als str.title() niet voor je werkt, doe dan zelf het hoofdlettergebruik.
One-liner:
>>> ' '.join([s[0].upper() + s[1:] for s in "they're bill's friends from the UK".split(' ')])
"They're Bill's Friends From The UK"
Duidelijk voorbeeld:
input = "they're bill's friends from the UK"
words = input.split(' ')
capitalized_words = []
for word in words:
title_case_word = word[0].upper() + word[1:]
capitalized_words.append(title_case_word)
output = ' '.join(capitalized_words)