Hogyan tegyük nagybetűssé egy szöveg szavainak kezdőbetűit?

Ez a kérdés, illetve feladat például olyankor merül fel, ha egy személynevet tartalmazó karakterlánc csupa kisbetűvel áll rendelkezésre, de megjeleníteni a helyesírás szabályai szerint kívánjuk, azaz a családi- és utónevet nagy kezdőbetűvel akarjuk írni. Egy másik eset, ha angol nyelvű cikkben, könyvben vagy más írásműben a karakterlánc címsorként szerepel. Ilyenkor az angolban az egyes szavak kezdőbetűit szokás nagybetűvel írni. E formázási stílus neve angolul „title case”.

A Pythonban egy szöveget ilyen címsor formára hozni például a karakterláncokra meghívható beépített title() metódussal lehet, ami a szöveg minden szavának kezdőbetűjét nagybetűsre, a többit kisbetűsre cseréli. Ha tehát a szöveg „john smith”, akkor „john smith”.title() eredménye „John Smith” lesz.

Mi van azonban akkor, ha a „She’s a doctor, isn’t she?” szövegre hívjuk meg a title() metódust? Ebben az esetben az eredmény ez lesz: „She’S A Doctor, Isn’T She? „

Ez azonban nem egészen az, amit vártunk, hiszen az aposztrófok utáni betűk is nagybetűk lettek.

Ennek oka, hogy a title() metódus a szövegben a szavakat nem úgy azonosítja, hogy szónak azt tekinti, amely karaktersorokat szóközök határolnak, hanem úgy, hogy határolójelnek a nem betű karaktereket tekinti. Másképp fogalmazva, szavaknak az összefüggő olyan betűsorozatokat tekinti, amelyek karakterei az Unicode kisbetűs, nagybetűs és nagybetűs kettősbetű kategóriákba esnek. Ezek Unicode kategóriajelölései: Ll, Lu és Lt.

Hogy kicsit jobban értsük a title() metódus működését, utánozzuk le egy title() nevű függvény definiálásával! Ezt két változatban is láthatjuk alább, de a logikája mindkettőnek ugyanaz, amely az első definícióban szereplő részletes kommentekből megérthető.

Mindkét változat használja az is_letter() nevű saját készítésű függvényt, amely annak megállapítására szolgál, hogy az argumentumként megadott karakter Ll, Lu vagy Lt kategóriába eső betű-e. Ennek eldöntéséhez felhasználtuk az unicodedata modul category() függvényét, amely a megadott karakter kategóriakódjával tér vissza. Ha ez nem egyezik a {‘Lu’, ‘Ll’, ‘Lt’} halmaz egyik elemével sem, akkor nem a title() értelmezése szerinti betűről van szó.

A title() metóduson kívül címsor formátumra alakításhoz a string modul capwords() függvénye is használható, amely a szavakat a megadható határoló jel szerint különíti el, amely alapesetben a szóköz.

A title() metódus, a saját készítésű title() függvény és a capwords() alkalmazásának eredményeit az alábbi tesztsorok mutatják.

Látható, hogy jelen esetben a title() metódus és az azt utánzó title() függvény azonos, de nem az igényeinknek megfelelő eredményt ad. A capwords() viszont igen.

E bejegyzés témájához a Python tudásépítés lépésről lépésre című e-könyv következő fejezetei kapcsolódnak: „Mit teszünk, amikor programozunk?” fejezetben az „Unicode röviden” és „Hogyan találjunk rá egy Unicode karakterre?” alfejezetek, valamint a „Beépített típusok nyilvános metódusai” fejezet „Sorozattípusú konténerek” alfejezetének „Karakterlánc” alcíme.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.