Etiket: metin işlemleri

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

    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