Vraťme se k hledání podřetězců. Snadno se dá zjistit, na kterém místě se daný podřetězec nachází. Jsou na to dokonce dvě funkce: str.find(něco)
a str.index(něco)
. Liší se chováním, když nic nenajdou: find
navrací -1
, zatímco index
v takovém případě vyhodí chybu.
>>> kupka_sena = "adélaještěnevečeřelaaprotojehladová"
>>> kupka_sena.find("jehla")
26
>>> "skaut".find("skin")
-1
>>> "skaut".index("skin")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
Pozice v řetězci se udávají tak, že první znak má číslo 0
, poslední znak tedy má číslo len(řetězec)-1
. Pro získání znaku z řetězce použijeme hranaté závorky řetězec[pozice]
.
>>> "petrolej"[0]
'p'
>>> len("petrolej")
8
>>> "petrolej"[7]
'j'
Podobně můžeme vybrat i nějakou část řetězce. Je daná pozicí, na které má začínat, a pozicí, před kterou má končit. Obě tahle čísla zapíšeme do hranatých závorek a oddělíme dvojtečkou.
>>> "petrolej"[0:4]
'petr'
>>> "petrolej"[2:6]
'trol'
>>> "petrolej"[4:8]
'olej'
Když číslo před nebo za dvojtečkou vynecháme, bere se za něj levý, resp. pravý okraj.
>>> "petrolej"[:4]
'petr'
>>> "petrolej"[4:]
'olej'
>>> "petrolej"[:]
'petrolej'
Můžeme dopsat ještě třetí číslo za další dvojtečku, a to bude udávat délku kroku, o jaký se posouváme při čtení znaků. Když není vyplněné, chová se Python, jako by tam byla jednička, tedy skáčeme vždy na následující znak.
>>> "petrolej"[0:4:2]
'pt'
>>> "petrolej"[0:4:3]
'pr'
Krok může být záporný, což prostě znamená čtení řetězce pozpátku. V tom případě musíme ale dávat pozor na první dvě hranice: druhé číslo udává konec čtení, takže musí tentokrát být menší než to první. Navíc vždy platí, že znak na pozici prvního čísla ve výsledku bude (podrobněji, bude to první znak výsledného řetězce) a znak na pozici druhého čísla ve výsledku nebude. Když některé z čísel vynecháme, považuje se za něj příslušný okraj řetězce.
>>> "petrolej"[4:0:-1]
'orte'
>>> "petrolej"[::-2]
'jlre'
Příklad. Napište funkci, která přetočí daný řetězec o daný počet znaků doleva. Nic se nesmí ztratit: co přeleze levý okraj, by se mělo objevit vpravo. Otočení je kladné a menší než délka řetězce; nemusíte řešit, co se stane jinak.
>>> zatoc("takapus", 2)
'kapusta'
Řešení.
def zatoc(text, n):
return text[n:] + text[:n]
Příklad. Napište funkci, která ze zadaného textu vybere a navrátí část napsanou uvnitř kulatých závorek.
>>> uvnitr_zavorek("Z tohohle textu (co je tady napsané) se vybere jenom kousek.")
'co je tady napsané'
Řešení.
def uvnitr_zavorek(text):
zacatek = text.find("(")
konec = text.find(")")
if 0 <= zacatek < konec:
return text[zacatek+1:konec]
return ""
Příklad. Napište funkci, která navrátí pozpátku totéž, co ta předchozí.
Řešení.def uvnitr_pozpatku(text):
zacatek = text.find("(")
konec = text.find(")")
if 0 <= zacatek < konec:
return text[konec-1:zacatek:-1]
return ""