Python - String


Šta je string u Pythonu?

String je niz karaktera. Karakter je jednostavno simbol. Na primjer, engleski jezik ima 26 karaktera (slova). Računari se ne bave znakovima, oni se bave brojevima (binarnim). Iako na ekranu možete vidjeti znakove, on se interno pohranjuje i njime se manipuliše kao kombinacija 0 i 1. Ova konverzija znaka u broj naziva se kodiranje, a obrnuti postupak je dekodiranje. ASCII i Unicode su neka od popularnih kodiranja koja se koriste. U Python-u. String je niz Unicode znakova. Unicode je predstavljen tako da uključuje svaki karakter na svim jezicima i donosi jednoobraznost u kodiranju.



Kako kreirati string u Python-u?

Stringovi se mogu stvoriti zatvaranjem znakova unutar jednostrukih ili dvostrukih navodnika. Čak se i trostruki navodnici mogu koristiti u Python-u, ali se obično koriste za predstavljanje višerednih stringova i docstringsa.

# definisanje stringa u Python-u
# Sve od sljedećeg je ekvivalentno stringu
my_string = 'Hello'
print(my_string)

my_string = "Hello"
print(my_string)

my_string = '''Hello'''
print(my_string)

# String s trostrukim navodnicima može se produžiti više redova
my_string = """Pozdrav, dobrodošli
           na sajt IT TUTORIJALI"""
print(my_string)


Kako pristupiti znakovima u String-u?

Pojedinačnim znakovima možemo pristupiti pomoću indeksiranja. Indeks počinje od 0. Pokušaj pristupa znaku izvan opsega indeksa podići će IndexError grešku. Indeks mora biti cijeli broj. Ne možemo koristiti floats ili druge tipove, jer će rezultiovati TypeError greškom. Python omogućava negativno indeksiranje svojih sekvenci. Indeks -1 odnosi se na posljednju stavku, -2 na drugu posljednju stavku i tako dalje. Skupu stavki u stringu možemo pristupiti pomoću operatora rezanja (slicing) : (dvotačka).

# Pristupanje karakterima stringa u Python-u
str = 'IT TUTORIJALI'
print('str = ', str)

# Prvi karakter
print('str[0] = ', str[0])

# Zadnji karakter
print('str[-1] = ', str[-1])

# Rezanje (slicing) od 2-gog do 5-og znaka
print('str[1:5] = ', str[1:5])

# Rezanje (slicing) od 6-og do 2-gog zadnjeg znaka
print('str[5:-2] = ', str[5:-2])

Ako pokušamo pristupiti indeksu izvan opsega ili upotrijebimo brojeve koji nisu cjelobrojni, dobićemo pogreške.

# Indeks mora biti u opsegu
>>> my_string[15]  
...
IndexError: string index out of range

# Indeks mora biti integer
>>> my_string[1.5] 
...
TypeError: string indices must be integers

Rezanje (Slicing) se može najbolje vizualizovati uzimajući u obzir da je indeks između elemenata kao što je prikazano na sljedećoj ilustraciji. Ako želimo pristupiti opsegu, potreban nam je indeks koji će izrezati dio iz stringa.



Kako promijeniti ili izbrisati string?

Stringovi su nepromjenjive. To znači da se elementi stringa ne mogu mijenjati nakon što im se dodijele. Jednostavno možemo dodijeliti različite stringove istom imenu.

>>> my_string = 'ittutorijali'
>>> my_string[5] = 'o'
...
TypeError: 'str' object does not support item assignment
>>> my_string = 'Python'
>>> my_string
'Python'

Ne možemo izbrisati niti ukloniti znakove iz stringa, ali potpuno brisanje stringa moguće je pomoću ključne riječi del.

>>> del my_string[1]
...
TypeError: 'str' object doesn't support item deletion
>>> del my_string
>>> my_string
...
NameError: name 'my_string' is not defined


Python string operacija

Mnogo je operacija koje se mogu izvoditi sa stringovima što ga čini jednim od najčešće korištenih tipova podataka u Python-u. Da biste saznali više o vrstama podataka dostupnim u Python-u, pogledajte lekciju: Python tipovi podataka



Spajanje dva ili više stringova

Spajanje dva ili više stringova u jedan naziva se spajanje. Operator + to radi u Python-u. Jednostavno pisanje dva stringa zajedno sa njima takođe ih povezuje. Operator * se može koristiti za ponavljanje stringa određenog broja puta.

# Python String Operatior
str1 = 'Hello'
str2 ='World!'

# Koristimo +
print('str1 + str2 = ', str1 + str2)

# Koristimo *
print('str1 * 3 =', str1 * 3)

Dva string literala takođe povezujemo sa + operator. Ako želimo spojiti stringove u različite redove, možemo koristiti zagrade.

>>> # Dva stringa literala zajedno
>>> 'Hello ''World!'
'Hello World!'

>>> # Koristećemo zagrade
>>> s = ('Hello '
...      'World')
>>> s
'Hello World'


Iteracija kroz string

Možemo ponoviti string pomoću for petlje. Evo primjera za brojanje slova 'l' u stringu.

# Iteracija kroz string
count = 0
for letter in 'Hello World':
    if(letter == 'l'):
        count += 1
print(count,'slovo pronađeno')


Test članstva u stringu (Membership Test)

Možemo testirati postoji li podstring u stringu ili ne, koristeći ključnu riječ in.

>>> 'a' in 'program'
True
>>> 'at' not in 'ittutorijali'
False


Ugrađene funkcije za rad s Python-om

Razne ugrađene funkcije koje rade s sekvencama rade i sa stringovima. Neki od najčešće korištenih su enumerate() i len(). Funkcija enumerate() vraća enumerate objekt. Sadrži indeks i vrijednost svih stavki u stringu kao parove. Ovo može biti korisno za ponavljanje. Slično tome, len() vraća dužinu (broj znakova) stringa.

str = 'ittutorijali'

# enumerate()
list_enumerate = list(enumerate(str))
print('list(enumerate(str) = ', list_enumerate)

# Broj znakova
print('len(str) = ', len(str))


Oblikovanje Python stringova


Escape Sequence

Ako želimo ispisati tekst kao što je: ,"Što je tu?", ne možemo koristiti jednostruke ni dvostruke navodnike. To će rezultovati SyntaxError greškom, jer sam tekst sadrži i jednostruke i dvostruke navodnike.

>>> print("Pozdrav, "Šta je tu?"")
...
SyntaxError: invalid syntax
>>> print('Pozdrav, "Šta je tu?"')
...
SyntaxError: invalid syntax

Jedan od načina da se zaobiđe ovaj problem je upotreba trostrukih navodnika. Alternativno, možemo koristiti izlazne sekvence. Sljed bijega započinje obrnutom kosom crtom i različito se tumači. Ako koristimo jedan navodnik za predstavljanje stringa, svi pojedinačni navodnici unutar stringa moraju se izbjeći. Sličan je slučaj sa dvostrukim navodnicima. Evo kako se to može učiniti za predstavljanje gornjeg teksta.

# Koristenje trostrukih navodnika
print('''Pozdrav, "Šta je tu?"''')

# Bježanje (escaping) od jednostrukih navodnika
print('Pozdrav, "Šta je tu?"')

# Bježanje (escaping) od dvostrukih navodnika
print("Pozdrav, \"Šta je tu?\"")

U tabeli je prikazana lista svih izlaznih sekvenci koje podržava Python.

Sekvence bjega (Escape Sequence) Opis
\newline Backslash i novi red se zanemaruju
\\ Backslash
\' Jednostruki navodni znakovi
\" Dvostruki navodni znakovi
\a ASCII Bell
\b ASCII Backspace
\f ASCII Formfeed
\n ASCII Linefeed
\r ASCII Carriage Return
\t ASCII Horizontal Tab
\v ASCII Vertical Tab
\ooo Karakter sa osmerostrukom vrijednošću ooo
\xHH Karakter sa heksadecimalnom vrijednošću HH

Evo nekoliko primjera:

>>> print("C:\\Python32\\Lib")
C:\Python32\Lib

>>> print("Ovo se ipsiuje u\nin dvije linije")
Ovo se ipsiuje u
dvije linije

>>> print("Ovo je \x48\x45\x58 zastupanje")
Ovo je HEX zastupanje


Metoda formata() za formatiranje stringova

Metoda format() koja je dostupna s objektom stringa vrlo je svestrana i moćna u oblikovanju stringova. Format stringova sadrže vitičaste zagrade {} kao rezervisana mjesta ili zamjenska polja koja se zamjenjuju. Za određivanje redosljeda možemo koristiti pozicijske argumente ili argumente ključnih riječi.

# Python string format() metoda

# Zadani (implicitni) redosljed
default_order = "{}, {} and {}".format('Miloš','Marko','Stefan')
print('\n--- Zadanim redom ---')
print(default_order)

# Redosljed koristeći pozicijski argument
positional_order = "{1}, {0} and {2}".format('Miloš','Marko','Stefan')
print('\n--- Pozicijskim redosljednom ---')
print(positional_order)

# Redosljed koristeći argument ključne riječi
keyword_order = "{s}, {b} and {j}".format(j='Jovan',b='Bojan',s='Stefan')
print('\n--- redosljed ključnih riječi ---')
print(keyword_order)

Metoda format() može imati neobavezne specifikacije formata. Od imena polja odvajaju se dvotačkom. Na primjer, možemo poravnati lijevo <, right-justify > ili centrirati ^ string u zadanom prostoru. Takođe možemo formatirati cijele brojeve kao binarne, heksadecimalne itd., a float možemo prikazani u eksponentnom formatu. Postoji mnoštvo formatiranja koje možete koristiti.

>>> # Formatiranje cijelih brojeva (integers)
>>> "Binarni prikaz od {0} je {0:b}".format(12)
'Binarni prikaz od 12 je 1100'

>>> # Formatiranje floats
>>> "Zastupljenost eksponenta: {0:e}".format(1566.345)
'Zastupljenost eksponenta: 1.566345e+03'

>>> # Zaokruživanje
>>> "Jedna trećina je: {0:.3f}".format(1/3)
'Jedna trećina je: 0.333'

>>> # Poravnanje stringa
>>> "|{:<10}|{:^10}|{:>10}|".format('margarin','hljeb','med')
'|margarin    |  hljeb   |       med|'


Stari stil formatiranja (Old style formatting)

Možemo čak formatirati stringove poput starog stila uz pomoć sprintf() koji se koristi u programskom jeziku C. Koristimo % operator da bismo to postigli.

>>> x = 12.3456789
>>> print('Vrijednost x je: %3.2f' %x)
Vrijednost x je: 12.35
>>> print('Vrijednost x je: %3.4f' %x)
Vrijednost x je: 12.3457


Uobičajene Python string metode

Postoje brojne metode dostupne s objektom string. Metoda format() koju smo gore spomenuli jedna je od njih. Neke od najčešće korištenih metoda su: lower(), upper(), join(), split(), find(), replace() itd. Ovdje je potpuni popis svih ugrađenih metoda za rad sa stringovima u Python-u.

>>> "ItTuToRiJaLi".lower()
'ittutorijali'

>>> "ItTuToRiJaL".upper()
'ITTUTORIJALI'

>>> "Ovo će podijeliti sve riječi u listu".split()
['Ovo', 'će', 'podijeliti', 'sve', 'riječi', 'u', 'listu']

>>> ' '.join(['Ovo', 'će', 'spojiti', 'sve', 'riječi', 'u', 'string'])
'Ovo će spojiti sve riječi u string'

>>> 'Happy New Year'.find('ew')
7

>>> 'Happy New Year'.replace('Happy','Brilliant')
'Brilliant New Year'