String İşlemleri: Metinlerle Çalışmak (Python Dersi 11)

Bir uygulamaya adını yazdığında, bir arama kutusuna kelime girdiğinde ya da bir tweet atarken karakter sayısının azaldığını gördüğünde arka planda hep aynı şey çalışıyor: metin işlemleri. Python’da metne string (kısaca str) deniyor ve bu derste metinleri kesmeyi, bölmeyi, aramayı, değiştirmeyi ve düzgün biçimlendirmeyi öğreneceğiz. Bir de Türkçe yazan herkesin bir gün karşılaşacağı bir tuzağa bakacağız: I ve İ harfleri.

Kodların hepsi Colab’da hazır: Colab’da Aç

Metin bir karakter dizisidir

Python’a göre bir metin, sıraya dizilmiş karakterlerden oluşuyor. Bu yüzden Ders 7’de listelerde öğrendiğin indeksleme ve dilimleme metinlerde de aynen çalışıyor:

s = "Merhaba Dünya"
print(len(s)) # 13 (boşluk da bir karakter)
print(s[0]) # M
print(s[-1]) # a
print(s[0:7]) # Merhaba
print(s[::-1]) # aynüD abahreM

Son satırdaki [::-1] metni tersine çeviriyor: baştan sona, -1 adımla, yani geriye doğru.

Metinler değiştirilemez

Listelerden önemli bir farkı var: Bir metnin tek bir karakterini değiştiremezsin.

s[0] = "m"
# TypeError: 'str' object does not support item assignment

Bu ders boyunca göreceğin bütün metotlar aslı değiştirmiyor, yeni bir metin döndürüyor. Değişikliği saklamak istiyorsan sonucu bir değişkene atamalısın: s = s.lower().

Büyük-küçük harf ve boşluklar

print(s.upper()) # MERHABA DÜNYA
print(s.lower()) # merhaba dünya
print("adana kebap".title()) # Adana Kebap
print("ADANA".capitalize()) # Adana
print(" ayşe ".strip() + "|") # ayşe|

strip() baştaki ve sondaki boşlukları siliyor. Ders 10’daki sayı tahmin oyununda kullanıcı girişini temizlemek için kullanmıştık. Formlardan, dosyalardan gelen metinlerde baştaki ve sondaki boşluklar en sık karşılaşılan sorunlardan biri.

Türkçe karakter tuzağı: I ve İ

Bu bölümü atlama, çünkü Türkçe metinlerle çalışan herkesin başına gelir:

print("istanbul".upper()) # ISTANBUL (İSTANBUL olmalıydı)
print("ISPARTA".lower()) # isparta (ısparta olmalıydı)

Python’un upper ve lower metotları İngilizce kurallarını uyguluyor. İngilizcede küçük i’nin büyüğü I, büyük I’nın küçüğü i. Türkçede ise dört ayrı harf var: ı, I, i, İ. Üstelik "İSTANBUL".lower() ekranda “istanbul” gibi görünse de içinde görünmez fazladan bir nokta işareti taşıyor; uzunluğu 8 değil 9 çıkıyor ve “istanbul” ile karşılaştırınca eşit sayılmıyor.

Küçük bir çözüm: dönüşümden önce bu harfleri kendin değiştir.

def tr_lower(metin):
return metin.replace("I", "ı").replace("İ", "i").lower()
def tr_upper(metin):
return metin.replace("i", "İ").replace("ı", "I").upper()
print(tr_lower("ISPARTA İZMİR")) # ısparta izmir
print(tr_upper("istanbul ılgaz")) # İSTANBUL ILGAZ

Bir kullanıcı adı araması, bir şehir listesi ya da Türkçe bir metindeki kelimeleri saymak gibi işlerde bu fark sonuçları doğrudan değiştiriyor.

Bölmek ve birleştirmek: split ve join

meyveler = "elma,armut,muz"
liste = meyveler.split(",")
print(liste) # ['elma', 'armut', 'muz']
print(" - ".join(liste)) # elma - armut - muz
print("python veri bilim".split()) # ['python', 'veri', 'bilim']

split bir metni verdiğin ayırıcıdan bölüp liste yapıyor; ayırıcı vermezsen boşluklardan bölüyor. join tam tersini yapıyor: Bir listeyi aradaki metinle birleştiriyor. join‘in yazımı ilk başta ters gelebilir; ayırıcı başta, liste parantezin içinde.

Aramak ve değiştirmek

kelime = "bilgisayar"
print(kelime.count("a")) # 2
print(kelime.find("say")) # 5 (kaçıncı sırada başlıyor)
print(kelime.find("x")) # -1 (bulunamadı)
print("say" in kelime) # True
print("merhaba".replace("a", "4")) # merh4b4
print("ayse@ornek.com".endswith(".com")) # True
print("Dr. Can".startswith("Dr.")) # True

Sadece “var mı, yok mu?” diye soruyorsan in en okunaklı yol. Nerede olduğunu da bilmek istiyorsan find.

f-string ile biçimlendirmek

f-string’leri Ders 4’ten ve f-string kod kartından tanıyorsun. Süslü parantezin içine : koyup biçim de verebilirsin:

ad = "zeynep"
pi = 3.14159
print(f"Merhaba {ad.title()}!") # Merhaba Zeynep!
print(f"{pi:.2f}") # 3.14
print(f"[{ad:>10}]") # [ zeynep] sağa yasla
print(f"[{ad:<10}]") # [zeynep ] sola yasla

Mini program: metin analizcisi

Öğrendiklerimizi bir fonksiyonda birleştirelim. Bir metnin karakter sayısını, kelime sayısını, en uzun kelimesini ve en sık geçen kelimesini bulalım:

def metin_analizi(metin):
"""Bir metnin kelime sayısını, en uzun kelimesini ve en sık geçen kelimesini döndürür."""
kelimeler = [k.strip(".,!?;:").lower() for k in metin.split()]
sayac = {}
for k in kelimeler:
sayac[k] = sayac.get(k, 0) + 1
return {
"karakter": len(metin),
"kelime": len(kelimeler),
"en_uzun": max(kelimeler, key=len),
"en_sik": max(sayac, key=sayac.get),
}
metin = "Python öğrenmek eğlenceli. Python ile veri analizi de eğlenceli!"
for ad, deger in metin_analizi(metin).items():
print(f"{ad:<10} {deger}")
karakter 64
kelime 9
en_uzun eğlenceli
en_sik python

İlk satırdaki liste üreteci her kelimenin ucundaki noktalama işaretlerini strip ile siliyor ve küçük harfe çeviriyor. Bunu yapmasaydık “eğlenceli.” ile “eğlenceli!” iki farklı kelime sayılırdı. Gerçek veriyle çalışırken metin işleminin büyük kısmı bu tür temizlikten oluşuyor.

İki küçük program daha:

def palindrom_mu(metin):
"""Boşlukları ve noktalamayı yok sayarak metin tersten de aynı mı diye bakar."""
temiz = "".join(h for h in tr_lower(metin) if h.isalnum())
return temiz == temiz[::-1]
print(palindrom_mu("Ey Edip Adanada pide ye")) # True
print(palindrom_mu("Python")) # False
def maskele(eposta):
kullanici, alan = eposta.split("@")
return kullanici[0] + "*" * (len(kullanici) - 1) + "@" + alan
print(maskele("ayse.yilmaz@ornek.com")) # a**********@ornek.com

isalnum() bir karakterin harf ya da rakam olup olmadığını söylüyor; boşlukları ve noktalamayı eleyerek sadece harfleri bırakıyoruz. "*" * 10 metni 10 kez tekrarlıyor. E-posta maskeleme, birçok uygulamanın şifre sıfırlama ekranında gördüğün “a***@ornek.com” yazısının basit bir hali.

[AFFILIATE: yeni başlayanlar için Python kitabı ya da kursu]

Alıştırmalar

  1. Kullanıcının adını ve soyadını ayrı ayrı alıp “Soyad, Ad” biçiminde, soyadı büyük harfle yazdır (örnek: YILMAZ, Ayşe). Türkçe karakterlere dikkat.
  2. Bir cümledeki sesli harflerin sayısını bulan sesli_say(cumle) fonksiyonu yaz.
  3. "2026-11-04" metnini split ile parçalayıp "04.11.2026" biçimine çevir.
  4. Bir şifrenin en az 8 karakter olduğunu, içinde en az bir rakam ve en az bir büyük harf bulunduğunu kontrol eden sifre_guclu_mu(sifre) fonksiyonu yaz.

Cevaplar Colab not defterinin sonunda.

Bu derste ne öğrendik?

  • Metinler indekslenip dilimlenebilir ama değiştirilemez; metotlar yeni bir metin döndürür.
  • upper, lower, title, strip ile harf ve boşluk düzenlenir.
  • Türkçede I ve İ için upper ve lower yanlış sonuç verir; dönüşümden önce harfleri kendin değiştir.
  • split metni listeye, join listeyi metne çevirir.
  • in, find, count, replace, startswith, endswith ile arama ve değiştirme yapılır.
  • f-string’de : ile biçim verilir: {pi:.2f}, {ad:>10}.

Sıradaki ders

Python Dersi 12’de kümeleri ve liste üreteçlerini öğreniyoruz.

Devamını oku


Hatice Özbolat | Teknoloji ve AI Rehberi sitesinden daha fazla şey keşfedin

Son gönderilerin e-postanıza gönderilmesi için abone olun.

Comments

Bir yanıt yazın