Siirry sisältöön

Python 3/Merkkijonot

Wikikirjastosta

Merkkijono voidaan määritellä ympäröimällä heittomerkeillä ('), lainausmerkeillä ({{") tai kolmella heitto- tai lainausmerkillä (''', """). Näitä merkkejä ei saa sekoittaa ("kissa').

  1. 'kissa' tai "kissa"
  2. '''kissa''' tai """kissa"""

Kolminkeraisia heitto- tai lainausmerkkejä käytetään monirivisten merkkijonojen merkitsemiseen.

'''
Kissa
kiipesi
puuhun.
'''

Merkkijono voidaan jakaa usealle riville myös \-merkillä

'kissa \
kiipesi \
puuhun. \
'

tai

'kissa '\
'kiipesi '\
'puuhun.'

Yhdisteleminen

[muokkaa | muokkaa wikitekstiä]

Pythonissa on useita eri tapoja yhdistellä ja muotoilla merkkijonoja.

Yhdisteleminen +-operaattorilla

[muokkaa | muokkaa wikitekstiä]
>>> print ('[[' + 'kissa' + ']]')
[[kissa]]

Numerot pitää muuttaa merkkijonoiksi ennen kuin +-operaattoria voi käyttää.

>>> nro = 2
>>> print ('[[' + 'kissa nro ' + nro + ']]') # Aiheuttaa virheen TypeError: can only concatenate str (not "int") to str
>>> print ('[[' + 'kissa nro ' + str(nro) + ']]')
[[kissa nro 2]]

Yhdistäminen str.join()-metodilla

[muokkaa | muokkaa wikitekstiä]

Kokonaisen listan merkkijonoja voi yhdstää helposti str-tyypin join-metodilla. Pitkien merkkijonojen luomiseksi tämä on usein tehokkaampi tapa kuin +-operaattorilla toistuvasti yhdistäminen, koska välivaiheita ei ole.

>>> pätkät = [ "Kokonaisen", "listan", "merkkijonoja", "voi", "yhdstää", "join-metodilla." ]
>>> erotin = " "
>>> erotin.join(pätkät)
'Kokonaisen listan merkkijonoja voi yhdstää join-metodilla.'

Merkkijonon ei tarvitse olla tallennettuna muuttujaan, vaan merkkijonovakion metodeita voi kutsua suoraankin.

>>> " ".join(pätkät)
'Kokonaisen listan merkkijonoja voi yhdstää join-metodilla.'

Lisää yhdistämistapoja käsitellään myöhemmin Merkkijonojen muotoilu -osiossa.

Merkin tai merkkijonon toistaminen

[muokkaa | muokkaa wikitekstiä]

Merkkijonoa voi toistaa *-operaattorilla.

>>> print('.' * 20)
....................
>>> print('~”~„' * 20)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Indeksointi tarkoittaa yksittäisen alkion paikan osoittamista taulukosta. Pythonissa merkkijono toimii hyvin samalla lailla kuin taulukko. Viipaloinnilla tarkoitetaan usean merkin alimerkkijonon osoittamista. Merkkijonojen tapauksessa on syytä huomata, että merkki ei ole aivan yksiselitteinen käsite eri kirjoitusjärjestelmissä ja Unicodessa.

Pythonissa indeksointi alkaa aina nollasta. Ensimmäisen merkin indeksi on siis 0 ja viimeisen (merkkijonon pituus − 1).

Merkki k i s s a
Indeksi 0 1 2 3 4
Negatiivinen indeksi −5 −4 −3 −2 −1

Indeksointi ja viipalointi tehdään []-operaattorilla.

>>> string = 'kissa'
>>> print(string[1])
'i'

Negatiivinen indeksi aloittaa lopusta. Viimeisen merkin negatiivinen indeksi on −1 ja ensimmäisen (−merkkijonon pituus). Myös tämä tulostaa i:n joka on neljänneksi viimeinen merkki merkkijonossa.

>>> string = 'kissa'
>>> print(string[-4])
'i'

Kokonaisen alimerkkijonon voi hakea viipalointioperaattorilla.

>>> string = 'kissa'
>>> print(string[1:4])
'iss'

Merkkijonon merkkejä ei voi muuttaa suoraan viipalointioperattorilla, sillä merkkijonot ovat Pythonissa muuttamattomia.

Erityismerkinnät

[muokkaa | muokkaa wikitekstiä]

Kaikkia merkkejä ei voi kirjoittaa sellaisenaan merkkijonoon. Näitä varten pitää käyttää erityismerkintää.

\n rivinvaihto
\t sarkain eli tabulaattori, jota käytetään taulukoinnissa tai sisennyksissä
\" lainausmerkki (")
\' puolilainausmerkki/heittomerkki (')
\\ kenoviiva (\)

Lainausmerkin tai heittomerkin voi myös kirjoittaa merkkijonoon käyttämällä merkkijonon merkintään toista.

"O'Malley"
'Tila: "odottaa".'

Rivinvaihdon voi kirjoittaa myös käyttämällä merkkijonon merkintään kolminkertaisia lainaus- tai puolilainausmerkkejä.

Näppäimistöltä löytymättömiä merkkejä voi myös kirjoittaa numeroarvoina.

\xhh Merkki, jonka koodipaikka heksadesimaalimuodossa on hh
\uhhhh Unicode-merkki, jonka koodipaikka heksadesimaalimuodossa on hhhh
\Uhhhhhhhh Unicode-merkki, jonka koodipaikka heksadesimaalimuodossa on hhhhhhhh
\N{NIMI} Unicode-merkki, jonka nimi on NIMI
>>> '\xe4'
'ä'
>>> '\u72ac'
'犬'
>>> '\U0001d195'
'𝆕'
>>> '\N{GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE}'
'🤪'

Käänteisesti merkin koodipaikan heksadesimaalimuodossa saa selville kirjoittamalla hex(ord(merkki)).

Alimerkkijonon haku

[muokkaa | muokkaa wikitekstiä]

Alimerkkijonon alkukohdan voi etsiä find- ja rfind sekä index- ja rindex-metodeilla sekä.

Find- ja index-metodien ainoa ero on, että find-metodit palauttavat -1, jos alimerkkijonoa ei löydy, kun taas index-metodit heittävät virheen.

find palauttaa ensimmäisen alimerkkijonon alkukohdan. Muista, että indeksointi alkaa aina nollasta.

>>> mj = "Kokko kokoo kokko"
>>> mj.find("okko")
1

Metodi palauttaa -1, jos alimerkkijonoa ei löydy.

>>> mj.find("tokko")
-1

Isot ja pienet kirjaimet ovat eriarvoisia.

>>> mj.find("kokko")
12

Valinnaisesti voi antaa alkukohdan, josta etsintä aloitetaan tai alku- ja loppukohdan. Huomaa, että loppukohta merkitään yksi merkki viimeisen kohdan yli ja koko alimerkkijonon pitää mahtua päätepisteiden väliin.

>>> mj = "Kokko kokoo kokko"
>>> mj.find("okko", 2)
13
>>> mj.find("okko", 2, 13)
-1
>>> mj.find("okko", 2, 17)
13

rfind toimii muuten kuin find, mutta etsii lopusta alkuun päin.

>>> mj.rfind("okko")
13
>>> mj.rfind("okko", 0, 13)
1

Indeksit voi merkitä myös lopusta lukien negatiivisena, kuten viipaloinnissa.

>>> mj.rfind("okko", 0, -5)
1

Alimerkkijonon korvaus toisella

[muokkaa | muokkaa wikitekstiä]

Alimerkkijonon voi vaihtaa toiseksi metodilla replace. Metodi palauttaa uuden merkkijonon, jossa annettu alimerkkijono on vaihdettu annettuun korvaajaan. Alkuperäinen merkkijono pysyy muuttumattomana.

>>> mj.replace("okko", "ukka")
'Kukka kokoo kukka'

Huomaa, että replace korvaa oletuksena kaikki alimerkkijonon esiintymät. Määrää voi tarvittaessa rajoittaa antamalla valinnaisena kolmantena parametrina korvausten määrän.

>>> mj.replace("okko", "ukka", 1)
'Kukka kokoo kokko'

Myös replace käsittelee pieniä ja suuria kirjaimia eri merkkeinä.

>>> mj.replace("kokko", "kukka")
'Kokko kokoo kukka'

Yhteenveto str-tyypin metodeista

[muokkaa | muokkaa wikitekstiä]
capitalize Muuttaa tekstin ensimmäisen kirjaimen isoksi.
casefold
center
count Laskee annettujen alimerkkijonojen määrän.
encode Palauttaa tekstin annetussa koodauksessa.
expandtabs
find(mj) Palauttaa indeksin, josta alimerkkijono mj alkaa tai -1, jos sitä ei löydy.
format
format_map
index Sama kuin find, mutta heittää virheen, jos merkkijonoa ei löydy.
join
ljust
lower Muuttaa kaikki kirjaimet pieniksi.
lstrip
maketrans
partition
replace
rfind
rindex
rjust
rpartition
rsplit
rstrip
split(erotin) Jakaa merkkijonon taulukoksi alimerkkijonojen erotin kohdalta.
splitlines
strip Poistaa tyhjät merkit alusta ja lopusta.
swapcase
title
translate
upper Muuttaa kaikki kirjaimet suuriksi.
zfill

Merkkijonon ominaisuuksia voi testata seuraavilla metodeilla. Ne palauttavat True, jos ehto täyttyy, muuten False.

endswith(loppu) päättyy tekstiin loppu
isalnum koostuu pelkästään aakkos-numeerisista merkeistä
isalpha koostuu pelkästään aakkosmerkeistä.
isascii koostuu pelkästään ASCII-merkeistä.
isdecimal
isdigit koostuu pelkästään numeroista
isidentifier
islower koostuu pelkästään pienistä kirjaimista (voi sisältää muitakin merkkejä)
isnumeric
isprintable
isspace koostuu pelkästään tyhjistä merkeistä (esim. " \t\n")
istitle jokainen sana alkaa isolla kirjaimella, mutta on muuten pienellä
isupper kaikki kirjaimet ovat isoja (voi sisältää muitakin merkkejä)
startswith(alku) alkaa tekstillä alku

Merkkijonojen muotoilu

[muokkaa | muokkaa wikitekstiä]

F-merkkijonot

[muokkaa | muokkaa wikitekstiä]

F-merkkijonoihin (f-strings) voi kirjoittaa Python-koodin suoraan merkkijonoon. F-merkkijonot erotetaan tavallisista merkkijoista kirjoittamalla f-kirjain ennen ensimmäistä lainausmerkkiä. Tekstin kohtaan kirjoitettavat muuttujat tai lausekkeet kirjoitetaan aaltosulkujen {} sisään.

>>> nimi = 'Olavi'
>>> ika = 78
>>> print(f'Nimi: {nimi}, ikä: {ika}')
Nimi: Olavi, ikä: 78

Aaltosulkujen väliin voi kirjoittaa kokonaisia Python-lauseita, ei pelkästään muuttujia.

>>> lista = [ 'eka', 'toka', 'kolkki' ]
>>> indeksi = 0
>>> print(f'Valittu alkio numero {indeksi + 1} {len(lista)}:sta: {lista[indeksi]}')
Valittu alkio numero 1 3:sta: eka


Tulostuksen voi muotoilla tarkemmin antamalla muotoilumerkkijonon :-merkin jälkeen. Muotoilukoodi on täydellisenä seuraavanlainen

<täyttömerkki><tasaus><etumerkki>[#][0]<kentän leveys><ryhmitys><.tarkkuus><esitysmuoto>

Näistä voi antaa tarvittavat ja jättää muut pois.

Täyttömerkki on merkki, jolla kenttä täytetään leveyteen.

Tasaus on jokin seuraavista:

  • < tasaus vasemmalle
  • > tasaus oikealle
  • ^ keskitys
  • = täyttömerkit tulevat etumerkin ja luvun väliin.
>>> print(f"Nimi: {nimi:.<15} Ikä: {ikä: 5} Maksettava: {232:x>5} €")
Nimi: Olavi.......... Ikä:    78 Maksettava: xx232 

Etumerkki on jokin seuraavista

  • - etumerkki näytetään vain negatiivisille luvuille (oletus)
  • + myös positiivisille luvuille käytetään etumerkkiä
  • (välilyönti) positiivisten lukujen etumerkin paikalle tulostetaan välilyönti,

#

0

Kentän leveys on merkkimäärä jonka kokoiseen tilaan luku muotoillaan.

>>> print(f"{13: 5}{9: 5}{232: 5}")
   13    9  232

Ryhmitys

Tarkkuus on desimaaliluvun desimaalien määrä. Tarkkuuden eteen kirjoitetaan piste.

>>> print(f"{13.434332:.2f}")
13.43

Esitysmuoto on muoto, jolla arvo esitetään.

Kokonaislukujen esitysmuodost ovat seuraavat.

b Luku muotoillaan binäärimuotoon.
c Luku muutetaan Unicde-merkiksi.
d Luku muotoillaan kymmenjärjestelmän muotoon. (oletus)
o Luku muotoillaan oktaalimuotoon.
x Luku muotoillaan heksadesimaalimuotoon.
n Luku muotoillaan tuhaterottimilla (nykyisen lokaalin mukaan.

Liukulukujen esitysmuodost ovat seuraavat.

e, E Tieteellinen esitysmuoto, joko isolla tai pienellä E:llä.
f, F
g, G
n Luku muotoillaan tuhaterottimilla (nykyisen lokaalin mukaan.
% Luku muotoillaan prosenttiluvuksi. Esim. 0.12 → ”12%”.
(ei mitään)

Merkkijonon muotoilu string.format-metodilla

[muokkaa | muokkaa wikitekstiä]

Merkkijonon muotoilu %-operaattorilla

[muokkaa | muokkaa wikitekstiä]

Myös vanhaa C:n printf-tyylistä muotoilua voi edelleen käyttää.

Operaattorin vasen operandi on muotoilumerkkijono ja oikea monikko, jossa on alkio jokaiselle muotoilumerkille.

>>> eläin1 = 'kissa'
>>> print ('[[%s]]' % (eläin1))
[[kissa]]
>>> eläin2 = 'koira'
>>> print ('[[%s]], [[%s]]' % (eläin1, eläin2))
[[kissa]], [[koira]]

Alla on lueteltu tärkeimmät muotoilukoodit.

%c yksittäinen merkki; Merkin voi antaa merkkijonona ("A") tai lukuna (65).
%d kokonaisluku
%f liukuluku
%s merkkijono
%% Korvataan yksittäisellä %-merkillä.

Muotoilukoodiin voi lisätä myös muita muotoiluohjeita. Muotoiluohjeen täydellinen muoto on

%(<nimi>)<lippu><kentän koko><.tarkkuus><tyyppi>

jossa

  • nimi on parametrin nimi, jonka arvoa käytetään, jos parametrit on annettu dictinä,
  • lippu on kentän muotoilua säätävä merkki
  • kentän koko on leveys, jonka kokoiseen kenttään tulos kirjoitetaan; jos *, luetaan koko seuraavasta parametrista
  • tarkkuus on kokonaisluvun desimaalien määrä ja; jos *, luetaan tarkkuus seuraavasta parametrista
  • tyyppi on tulostettavan arvon tyyppi.

Näistä voi antaa tarvittavat ja jättää muut pois.

Lippu voi olla jokin seuraavista.

#
0 Luku täytetään 0:lla kentän leveyteen.
(välilyönti) Luku täytetään välilyönnillä leveyteen.
- Luku tasataan kentän vasempaan laitaan.
+ Lukuun merkitään +-merkki, jos se on positiivinen.

Liukuluvun desimaalien määrän voi antaa pisteellä ja sen jälkeisellä luvulla.

>>> keskiarvo = 5.283852
>>> print('Keskiarvo: %.2f' % keskiarvo)
Keskiarvo: 5.28

Tulostus määräkokoisiin kenttiin.

>>> print("%10.2f %10d %10.2f" % (0.24566, 99, 1.2345))
      0.25         99       1.23

Kentän täyttäminen 0:lla tai välilyönnillä.

>>> print("Tili: %07d" % (99))
Tili: 0000099

Aiheesta muualla

[muokkaa | muokkaa wikitekstiä]