03 - String İşlemleri

Python'da Sringler'i başka veri tiplerinden ayıran en önemli özellik: "Tırnak Tipleri"dir.

#Bu kullanım da geçerli bir yoldur. Ama eğer mutlaka tek tırnak kullanmak istersek kaçış dizilerinden faydalanmamız gerektiğini önceki derslerimizde de söylemiştik:
print 'Python\'in 3.x sürümleri'
Python'in 3.x sürümleri
#Aşağıdaki örnekte kesme işaretinin karakter dizisini başlatan ve bitiren tırnak işaretleriyle karışmasını #önlemek için karakter dizisini tek tırnak yerine çift tırnak içine aldık. print "Python'in 3.x sürümleri"
Python'in 3.x sürümleri
#Çift tırnak yerine üç tırnak da kullanılabilir:
print """Python'in 3.x sürümleri"""
Python'in 3.x sürümleri
#Python’da karakter dizileri “değiştirilemeyen” (immutable) veri tipleridir.
#Yani karakter dizileri üzerinde değişiklik yapılamaz. 

#Karakter Dizilerini Birleştirmek
#Python'da String'leri birleştirmenin değişik yöntemleri vardır. Örneğin:

ad = "Umit Tamer"
soyad = "Sezgin"
ad_soyad = ad + soyad
print ad_soyad
Umit TamerSezgin
#Arada boşluk da olsun derseniz: bosluk = " " print ad + bosluk + soyad
Umit Tamer Sezgin
#Daha değişik bir örnek olarak for döngüsünü kullanarak bir kodlama da yapabilirsiniz.
#Örneğin, boşluk String'ine 0'dan 10'a kadar bir aralıkta değer de atamak için: 
a = ""
for i in range(10):
	a += str(i)
print a
0123456789
#Eğer değişiklik yapmak istersek (mutable) veri tipleri olan "listeler" (bkz. Liste-Tuple-Dict Yapısı bölümü) tercih edilebilir.

#String'leri (Karakter Dizilerini) Parçalara Ayırma İşlemleri:


#Örneğin aşağıdaki adres String değerinin "/dia-dev/ana-sayfa/python/string-islemleri" uzantı bölümünü atmak istersek:  
url = "https://sites.google.com/a/ly.com.tr/dia-dev/ana-sayfa/python/string-islemleri"

#Liste veri tiplerinden yararlanabiliriz:
print url[:36] #ya da "print url[0:36]"" satırı ile 0. öğeden 35. öğeye kadar String parçasını seçerek ekrana yazdırabiliriz.
https://sites.google.com/a/ly.com.tr
#Ya da aşağıdaki örnekteki gibi hem baştan hem sondan String'i parçalayarak da istediğimiz kısmı elde edebiliriz: string_deger = "Degisime ilk adim" #Bu sayede sadece "ilk" kelimesini seçmiş olduk print string_deger[9:12]
ilk
#Ya da belirli bir kısımdan başlayarak belirli aralıklarla keserek değişik bir veri de elde etmemiz mümkün: string_deger = "Degisime ilk adim" #len fonksiyonu kullanarak da stringin uzunluğunun değeri belirtebiliriz: print string_deger[0:len(string_deger):2]
Dgsm l dm
#Ya da String verimizi tersten inceleyebiliriz: print string_deger[::-1]
mida kli emisigeD
#Son olarak dilimlediğimiz String'ten yeni bir String de oluşturabiliriz: print string_deger[0] + string_deger[9] + string_deger[12] 
Dia
#Aşağıda: "url_list" String listesinin içinde bulunan adreslerin başındaki ("http://www) kısmını atarak yerlerine "ftp" ekleyen bir örnek: url_list = ["http://www.python.org", "http://www.istihza.com", "http://www.google.com", "http://www.yahoo.com"] for i in url_list: print "ftp" + i[10:]
ftp.python.org
ftp.istihza.com
ftp.google.com
ftp.yahoo.com
____STRING METOTLARI____
Büyük-Küçük Harf Değiştirme

Python’da karakter dizilerinin büyük-küçük harf durumlarını değiştirmek için kullanabileceğimiz beş farklı metot var. Bu metotlar şöyle sıralanabilir:

capitalize() metodu
Karakter dizilerinin ilk harfini büyütür.
title() metodu
Karakter dizisi içinde geçen her bir kelimenin ilk harfini büyütür.
upper() metodu
Küçük harflerden oluşan bir karakter dizisi içindeki bütün harfleri büyütür.
lower() metodu
Büyük harflerden oluşan bir karakter dizisi içindeki bütün harfleri küçültür.
swapcase() metodu
Karakter dizisi içindeki büyük harfleri küçük, küçük harfleri büyük hale getirir.
#Capitalize Metodu
print "ankara".capitalize()
Ankara
#ya da kent = 'ankara' print kent.capitalize()
Ankara
#Title Metodu print "baskent ankara".title()

Baskent Ankara
#ya da a = u"cumhurbaşkanlığı senfoni orkestrası" #Buradaki "u" harfi Türkçe karakterli kelimelerin düzgün çıktı versini sağlıyor. print a.title()
Cumhurbaşkanlığı Senfoni Orkestrası
#Upper Metodu print u"dia".upper()
DIA
#Lower Metodu print u"YERKÜRE".lower()
yerküre
#Swapcase Metodu yemek = u"ŞakŞuKa" print yemek.swapcase()
şAKşUkA
yem = u"DARI" print yem.swapcase()
dari

Büyük-Küçük Harf ve Boşluk Sorgulama

Python bize aynı zamanda karakter dizilerinin büyük-küçük harf durumlarını sorgulama imkanı da veriyor. Bu sorgulama işlemleri için de aşağıdakiler gibi birtakım metotlardan yararlanılır:

islower()
Karakter dizisinin tamamen küçük harflerden oluşup oluşmadığını sorgular.
#islower Metodu
print "ankara".islower()
True
isupper()
Karakter dizisinin tamamen büyük harflerden oluşup oluşmadığını sorgular.
#isupper Metodu
print "dia".isupper()
False
#ya da print u"YERKÜRE".isupper()
True
istitle()
Karakter dizisi içindeki kelimelerin ilk harflerinin büyük olup olmadığını sorgular.
#istitle Metodu
print "Baskent Ankara".istitle()
True
isspace()
Karakter dizisinin tamamen boşluk karakterlerinden oluşup oluşmadığını sorgular.
    #isspace Metodu
    print u"Cumhurbaşkanlığı Senfoni Orkestrası".isspace()
False

String Verilerde Karakter Değiştirme

#Replace Metodu Yardımıyla 2 ya da 3 parametre belirleyerek karakter değiştirebilir veya silebiliriz. Aşağıdaki örnekte "a" harfini gördüğü anda kodumuz "i" harfine dönüştürecektir:
kelime = u"Kahramanmaraş"
print kelime.replace("a","i")
Kihriminmiriş
#"a" harfini silmek istersek: kelime = u"Kahramanmaraş" kelime_silme = kelime.replace("a", "") print kelime_silme
Khrmnmrş
#replace'in 3. parametresini kullanarak belirli bir sayıda o karakterden silme (baştan başlayarak ilk iki "a" harfini sil): kelime = u"Kahramanmaraş" kelime_silme = kelime.replace("a", "", 2) print kelime_silme
Khrmanmaraş

String Verilerde Başlangıç ve Bitiş Değerleri Sorgulama

startswith()
String verinin belirli bir değer ile başlayıp başlamadığını sorgular.
#startswith Metodu
a = "elma"
print a.startswith("a")
print a.startswith("e")
False
True
endswith()
String verinin belirli bir değer ile bitip bitmediğini sorgular.
#endswith Metodu
b = "ayva"
print b.endswith("a")
print b.endswith("e")
True
False
#Kısaca şöyle bir kod yazarak cümle sonlarındaki noktalama işareti karakterlerini değiştirebiliriz: str1 = u"Ya ümitsizsiniz, ya ümit sizsiniz..." str2 = "Emeksiz yemek olmaz..." str3 = u"Kılçıksız balık, balıksız deniz olmaz..." str4 = u"Gülü seven, dikenine katlanır..." for i in str1, str2, str3, str4: if i.endswith("!") or i.endswith("."): print i.replace("...", ".")
Ya ümitsizsiniz, ya ümit sizsiniz.
Emeksiz yemek olmaz.
Kılçıksız balık, balıksız deniz olmaz.
Gülü seven, dikenine katlanır.

String Yapılarda Karakter Konumu Bulma

find() Metodu:
    Bir karakterin String bir verinin içinde nerede yani verinin hangi konumunda (index) bulunduğunu bulmaya yarar.
    #Find Metodu
    a = "adana"
    print a.find("a")
0
rfind() Metodu:
    Bir karakterin String bir verinin içinde nerede yani verinin hangi konumunda (index) bulunduğunu tersten ayni sağdan sola doğru arayıp bulmaya yarar.
    #rFind Metodu
    b = "sakarya"
    print b.find("a")
    print b.rfind("a")
1
6
join() Metodu:
    Bir String verinin içerisindeki herbir karakterden sonra eklemek istediğimiz karakteri birleştimeye yarar.
    #Join Metodu
    #Formatı: "eklemek istenilen string ya da karakter değer".join(değişkenin kendisi = elimizde olan string veri)
    a = "Linux"
    print ".".join(a)

L.i.n.u.x
    b = "Windows"     print "*".join(b)
W*i*n*d*o*w*s    
#Aşağıdaki gibi liste içindeki öğelere dosya yolu da verilebilir:
yol = ["C:", "Program Files", "Python26"]
print "\\".join(yol)
C:\Program Files\Python26
#Daha önceden boşluk String'ine 0'dan 10'a kadar bir aralıkta değer de atamak için yapılan birleştime örneğinin join metodu ile tek satırda yazılması:
print "".join([str(i) for i in range(10)])
0123456789

#Bir listedeki öğeleri bir cümlede belirli bir formata göre yazdıran fonksiyon satırı:

def stok ():
    stok = ["Mouse", "Klavye", u"Monitör"]
    print u"Stokta bulunan ürünler:\"",",".join(stok), "\""

stok()
Stokta bulunan ürünler:" Mouse,Klavye,Monitör "

String Yapılarda Karakter Kırpma

strip() Metodu:
    Bir String verinin başında (solunda) ve sonunda (sağında) yer alan boşluk ve yeni satır (\n) gibi karakterleri silemeye yarar.    
rstrip() Metodu:
    Bir String verinin sadece sonunda (sağında) yer alan boşluk ve yeni satır (\n) gibi karakterleri silemeye yarar.
lstrip() Metodu:
    Bir String verinin sadece başında (solunda) yer alan boşluk ve yeni satır (\n) gibi karakterleri silemeye yarar.    
print u"    İçimde bir boşluk var  ".strip()
print u"    İçimde bir boşluk var\n  ".rstrip()
print u"  \nİçimde bir boşluk var  ".lstrip()
İçimde bir boşluk var
    İçimde bir boşluk var
İçimde bir boşluk var

String Yapılarda Karakterleri Bölme

split() Metodu:
    Bir String verinin içerisindeki karakterleri soldan sağa doğru okuyarak belirlediğimiz bir karakter kriterine String veriyi bölüp liste haline getirmeye yarar.
    office = "Word, Excel, PowerPoint, Access"
    print office.split(",")
['Word', ' Excel', ' PowerPoint', ' Access']
    #2. bir parametre ile kaç kez ve nereden bölmek istediğinizi belirleyebilirsiniz:     sebze = "muz, lahana, semizotu, enginar"     print sebze.split(",",1)
['muz', ' lahana, semizotu, enginar']
rsplit() Metodu:
    Bir String verinin içerisindeki karakterleri sağdan sola doğru okuyarak belirlediğimiz bir karakter kriterine String veriyi bölüp liste haline getirmeye yarar. 
Daha detaylı bilgi için inceleyiniz: http://www.istihza.com/py2/kardiz.html
splitliness() Metodu:
    Bir String verinin içerisindeki karakterleri satır sonundan itibaren belirlediğimiz bir karakter kriterine String veriyi bölüp liste haline getirmeye yarar.
    #String veriyi "\n" kaçış dizisinin olduğu yerden ikiye bölme:     
    satir = "C# bir programlama dilidir.\nAma bir Python kadar degil."
    print satir.splitlines()
['C# bir programlama dilidir.', 'Ama bir Python kadar degil.']

String Yapılarda Karakter Sayımı

count() Metodu:
    Bir String verinin içerisindeki belirli bir karakterden kaç adet bulunduğunu belirlemeye yarar.
    #Aşağıdaki çalışmada kullanıcıdan herhangi bir karakter dizisi girmesini istiyoruz. 
    #Kodlarımız bize, kullanıcının girdiği karakter dizisi içinde her bir harften kaç tane olduğunu söylüyor:

    #replace metodu ile karakter dizisi içindeki boşlukları siliyoruz.
    soru = raw_input("Bir karakter dizisi giriniz: ").replace(" ", "")

    #Listeleri kullanarak, karakter dizisi içindeki
    #çift öğeleri teke indiriyoruz
    ortak = list(soru)

    #ortak kümesi içindeki öğeleri karakter dizisi içinde kaçar adet geçtiğini buluyoruz.
    for i in ortak:
        print "%s harfinden = => %s tane" %(i, soru.count(i))
Bir karakter dizisi giriniz: kahramanmaraş
k harfinden = => 1 tane
a harfinden = => 5 tane
h harfinden = => 1 tane
r harfinden = => 2 tane
a harfinden = => 5 tane
m harfinden = => 2 tane
a harfinden = => 5 tane
n harfinden = => 1 tane
m harfinden = => 2 tane
a harfinden = => 5 tane
r harfinden = => 2 tane
a harfinden = => 5 tane
ş harfinden = => 1 tane
input() ve raw_input() - Kullanıcıdan Integer ve String Veri Alma Fonksiuonları ve Güvenlik Açısından İşlevsel Farklılıkları
String işlemlerini ve sayısal işlemleri yakından ilgilendiren bir diğer konu ise:  "raw_input()" ve "input()" fonksiyonlarıdır.
#!/usr/bin/ env python
#-*- coding: utf-8 -*-

#raw_input() ve input() FONKSİYONU FARKLILIKLARI

"""
raw_input() ile input() arasındaki fark, aşağıdaki iki örnek arasındaki farka benzer:
Aşağıdaki örneklerde, Python’ın sayılara ve karakter dizilerine nasıl davrandığını görüyoruz.
Eğer Python iki adet sayıyla karşılaşırsa bu sayıları birbiriyle topluyor. 
Ama eğer iki adet karakter dizisiyle karşılaşırsa, bu karakter dizilerini yanyana yazmakla yetiniyor..."""

print 25 + 50 #Ekrana sayıların toplamı geliyor!
75
print "25" + "50" #Burada ise ekrana sayıların toplamı yerine "" içerisinde yazılmış bir String değer geliyor!
2550
#raw_input() fonksiyonunu kullanırken parantez içinde yazdığımız karakter dizisi, #kullanıcıdan ne beklediğimizi göstermemizi sağlar. #Eğer daha sonra kullanmak üzere bir değişkene atayarak bu bilgiyi kullanıcıdan alırsak, bu bilginin String tipinde aktarılacağını unutmayalım: sayi = raw_input("Bir sayi girin. Ben size o sayinin karesini soyleyeyim: ") print "\nGirdiginiz sayi \t\t: %s" %(sayi) print "\nGirdiginiz sayinin karesi: %s" % (sayi * sayi) #Burada hata mesajı alacağız çünkü aladığımız veri tipi String ve String bir değer ile matematiksel bir işlem yapılamaz!'
Bir sayi girin. Ben size o sayinin karesini soyleyeyim: 5

Girdiginiz sayi                 : 5

Traceback (most recent call last):
  File "C:\Users\UTS\Desktop\dev\16Ex_string.py", line 23, in <module>
    print "Girdiginiz sayinin karesi: %s" % (sayi * sayi) #Burada hata mesaj─▒ a
laca─ş─▒z ├ğ├╝nk├╝ alad─▒─ş─▒m─▒z veri tipi String ve String bir de─şer ile mate
matiksel bir i┼şlem yap─▒lamaz!'
TypeError: can't multiply sequence by non-int of type 'str'
#Bunun yerine Stirng değerimizi Integer değere dönüştürerek şu işlemimizi yapabiliriz: print "\nGirdiginiz sayi\t\t: %s" %int(sayi) print "\nGirdiginiz sayinin karesi: %s" % int(sayi) ** 2
Bir sayi girin. Ben size o sayinin karesini soyleyeyim: 5
Girdiginiz sayi                 : 5
#Bu sayede String olarak girdiğimiz sayı değerimiz Integer bir rakama dönüştürüldü. #Fakat eğer kullanıcımız rakam yerine yanlışlıkla karakter ya da String bir değer girerse bunun için de şu şekilde bir önlem almamız mümkün: try: n = int(sayi) print "Girdiginiz sayinin karesi: ", n ** 2 except ValueError: print "String bir deger yerine Integer bir rakam giriniz: "
Girdiginiz sayi                 : s
Traceback (most recent call last):
  File "C:\Users\UTS\Desktop\dev\16Ex_string.py", line 27, in <module>
    print "Girdiginiz sayi\t\t: %s" %int(sayi)
ValueError: invalid literal for int() with base 10: 's'
String bir deger yerine Integer bir rakam giriniz:
#Try...except blokları ve ne işe yaradığını "try, except (hata yakalama)" bölümünden ayrıntılı olarak öğrenebilirsiniz.
#Şimdilik bilmemiz gereken burada girdiğimiz verinin yanlış veri tipinde olduğundan dolayı programımızın vereceği hatayı yakalayıp hata mesajı vermek istediğimizdir.

"""
raw_input() fonksiyonundan farklı olarak input() fonksiyonu kullanıcıdan gelen verileri olduğu gibi alır. 
Yani bu verileri karakter dizisine dönüştürmez. Bu yüzden, eğer kullanıcı bir sayı girmişse, input() fonksiyonu bu sayıyı olduğu gibi alacağı için, bizim bu sayıyla aritmetik işlem yapmamıza müsaade eder."""

sayi = input("Bir sayi girin. Ben size o sayinin karesini soyleyeyim: ")

print "\nGirdiginiz sayi \t\t: %s" %(sayi)
print "\nGirdiginiz sayinin karesi: %s" % (sayi * sayi)

Bir sayi girin. Ben size o sayinin karesini soyleyeyim: 5
Girdiginiz sayi         : 5
Girdiginiz sayinin karesi: 25
""" input() fonksiyonu, kullanıcının geçerli bir Python komutu girmesini bekler. Yani eğer kullanıcının girdiği şey Python’ın etkileşimli kabuğunda hata verecek bir ifade ise, input()'lu kodunuz da hata verecektir. Dolayısıyla eğer biz programımız aracılığıyla kullanıcılardan bazı sayılar isteyeceksek ve eğer biz bu sayıları işleme sokacaksak (çıkarma, toplama, bölme gibi...) input() fonksiyonunu tercih edebiliriz. Ama eğer biz kullanıcılardan sayı değil de karakter dizisi girmesini istiyorsak raw_input() fonksiyonunu kullanacağız. Aşağıdaki örnekte programımız derece santigratı fahrenhayta dönüştürecektir:""" santigrat = input("Santigrat cinsinden bir deger girin: ") fahrenhayt = santigrat * (9.0/5.0) + 32 print ("%s santigrat derece %s fahrenhayta karsilik gelir." %(santigrat, fahrenhayt))
Santigrat cinsinden bir deger girin: 25
25 santigrat derece 77.0 fahrenhayta karsilik gelir.
""" Buraya kadar temel farklılıkları öğrenmiş olduk. Fakat önemli bir nokta var ki Pyhton'da input fonksiyonu direkt olarak kullanıcıdan gelen bilgiyi bir komut olarak algıladığından eğer ki input fonksiyonu içine değer yerine sistem komutu girerseniz onu da çalıştıracaktır. Başta çok hoş bir özellik gibi görünse de bu, aslında beraberinde bazı güvenlik risklerini de getirir. eval("__import__('os').system('del bir_dosya')") Yukarıdaki bu satır, bütün sabit diski silmek gibi bir işlemi gerçekleştireceğinden eğer özellikle sunucu üzerinden çalışacak kodlar yazıyorsanız input() fonksiyonunu kullanırken dikkatli olmalısınız. input() fonksiyonunun yukarıdaki risklerinden ötürü Python programcıları genellikle bu fonksiyonu kullanmamayı tercih eder. Bunun yerine her zaman raw_input() fonksiyonu kullanılır. Zaten raw_input() fonksiyonu kullanıcıyla veri alış-verişine ilişkin bütün ihtiyaçlarımızı karşılayacak özelliktedir."""

Comments