Java’nin Temelleri
2026
---
title: String İşlemleri ve Metin Problemleri
description: String sınıfı metodları, metin manipulasyonu ve karakter işlemlerini öğrenin
keywords: string, metin, karakter, Python, programlama
author: Teknik Kitap Yazarı
date: 2024
---Programlamada metin işlemleri, en sık karşılaşılan ve en önemli konulardan biridir. Kullanıcı girdilerini işleme, dosya okuma/yazma, veri temizleme ve metin tabanlı algoritmalar geliştirme gibi birçok alanda string işlemleri kritik rol oynar.
Bu bölümde, Python’daki str sınıfının sunduğu zengin metodları, metin manipulasyonu tekniklerini ve karakter işlemlerini adım adım inceleyeceksiniz. Temel string işlemlerinden başlayarak, gelişmiş metin problemlerinin çözümüne kadar geniş bir yelpazede bilgi edineceksiniz.
💡 Pedagojik Not: Bu bölümdeki her konuyu, verilen kod örneklerini kendi bilgisayarınızda çalıştırarak pekiştirmeniz önerilir. Gerçek dünya problemlerinde string işlemleri sıklıkla kullanıldığından, bu konulara hakim olmak programlama becerilerinizi önemli ölçüde geliştirecektir.
Python’da string oluşturmanın birden fazla yolu vardır. En yaygın yöntem, tek tırnak (') veya çift tırnak (") kullanmaktır.
📘 Önemli Bilgi: String’ler Python’da immutable (değişmez) veri tipleridir. Bir string oluşturulduktan sonra içeriği değiştirilemez. Değişiklik yapmak istediğinizde yeni bir string oluşturmanız gerekir.
## 10.3 String oluşturma örnekleri
isim = "Ahmet" # Çift tırnak ile
metin = 'Merhaba Dünya' # Tek tırnak ile
bos_string = "" # Boş string
cok_satirli = """Bu bir
çok satırlı
string örneğidir."""
print(f"İsim: {isim}")
print(f"Metin: {metin}")
print(f"Boş mu?: {len(bos_string) == 0}")
print(f"Çok satırlı: {cok_satirli}")Çıktı:
İsim: Ahmet
Metin: Merhaba Dünya
Boş mu?: True
Çok satırlı: Bu bir
çok satırlı
string örneğidir.
String’ler, karakter dizileri olduğu için indekslenebilirler. Python’da indeksleme 0’dan başlar ve negatif indeksler sondan başa doğru sayar.
💡 İpucu: Negatif indeksleme, bir string’in sonundan itibaren karakterlere erişmek için oldukça kullanışlıdır. Örneğin,
metin[-1]her zaman son karakteri verir.
metin = "Python Programlama"
## 10.4 Uzunluk
print(f"Uzunluk: {len(metin)}")
## 10.5 Pozitif indeksleme
print(f"İlk karakter (0): '{metin[0]}'")
print(f"3. karakter (2): '{metin[2]}'")
## 10.6 Negatif indeksleme
print(f"Son karakter (-1): '{metin[-1]}'")
print(f"Sondan 3. karakter (-3): '{metin[-3]}'")Çıktı:
Uzunluk: 19
İlk karakter (0): 'P'
3. karakter (2): 't'
Son karakter (-1): 'a'
Sondan 3. karakter (-3): 'm'
Dilimleme, bir string’in belirli bir bölümünü almak için kullanılır. [başlangıç:bitiş:adım] formatında kullanılır.
⚠️ Dikkat: Dilimleme işleminde
bitişindeksi dahil değildir. Yanimetin[0:5]ifadesi 0, 1, 2, 3, 4. indeksleri alır, 5. indeksi almaz.
metin = "Merhaba Dünya"
## 10.7 Temel dilimleme
print(f"İlk 7 karakter: '{metin[:7]}'") # 'Merhaba'
print(f"5. karakterden sonra: '{metin[5:]}'") # 'ba Dünya'
## 10.8 Adım kullanarak
print(f"Her 2. karakter: '{metin[::2]}'")
print(f"Ters çevrilmiş: '{metin[::-1]}'")
## 10.9 Negatif indekslerle dilimleme
print(f"Son 5 karakter: '{metin[-5:]}'")
print(f"2. indeksten 8. indekse: '{metin[2:8]}'")Çıktı:
İlk 7 karakter: 'Merhaba'
5. karakterden sonra: 'ba Dünya'
Her 2. karakter: 'MraaDny'
Ters çevrilmiş: 'aynaD übahreM'
Son 5 karakter: 'Dünya'
2. indeksten 8. indekse: 'rhaba '
Python, metinlerin büyük/küçük harf durumlarını değiştirmek için çeşitli metodlar sunar.
📘 Önemli Bilgi:
casefold()metodu,lower()metodundan daha agresif bir küçük harf dönüşümü yapar. Özellikle Almanca ‘ß’ gibi özel karakterler için kullanışlıdır.
metin = "pYthon prOgramlama DİLİ"
## 10.11 Temel dönüşümler
print(f"Orijinal: {metin}")
print(f"Büyük harf: {metin.upper()}")
print(f"Küçük harf: {metin.lower()}")
print(f"Başlık formatı: {metin.title()}")
print(f"İlk harf büyük: {metin.capitalize()}")
## 10.12 Swapcase - büyük/küçük harf değiştirme
print(f"Swapcase: {metin.swapcase()}")
## 10.13 Casefold - özel karakterler için
ozel_metin = "STRASSE"
print(f"Lower: {ozel_metin.lower()}")
print(f"Casefold: {ozel_metin.casefold()}")Çıktı:
Orijinal: pYthon prOgramlama DİLİ
Büyük harf: PYTHON PROGRAMLAMA DİLİ
Küçük harf: python programlama dili
Başlık formatı: Python Programlama Dili
İlk harf büyük: Python programlama dili
Swapcase: PyTHON PRoGRAMLAMA dili
Lower: strasse
Casefold: strasse
Metinlerdeki gereksiz boşlukları ve özel karakterleri temizlemek için çeşitli metodlar bulunur.
💡 İpucu:
strip()metodu varsayılan olarak boşluk karakterlerini temizler. İsteğe bağlı olarak hangi karakterlerin temizleneceğini belirtebilirsiniz.
## 10.14 Boşluk temizleme
metin = " Merhaba Dünya "
print(f"Strip: '{metin.strip()}'")
print(f"Lstrip: '{metin.lstrip()}'")
print(f"Rstrip: '{metin.rstrip()}'")
## 10.15 Özel karakter temizleme
metin2 = "***Merhaba***"
print(f"* strip: '{metin2.strip('*')}'")
## 10.16 Replace ile karakter değiştirme
metin3 = "Merhaba Dünya"
print(f"Replace: '{metin3.replace('a', 'e')}'")
## 10.17 translate() ile toplu dönüşüm
tablo = str.maketrans({'a': 'e', 'ı': 'i', 'o': 'ö'})
print(f"Translate: '{metin3.translate(tablo)}'")Çıktı:
Strip: 'Merhaba Dünya'
Lstrip: 'Merhaba Dünya '
Rstrip: ' Merhaba Dünya'
* strip: 'Merhaba'
Replace: 'Merhebe Dünye'
Translate: 'Merhebe Dünye'
Metinleri parçalara ayırmak ve birleştirmek için kullanılan metodlar, veri işleme süreçlerinde sıklıkla kullanılır.
⚠️ Dikkat:
split()metodu varsayılan olarak tüm boşluk karakterlerine (space, tab, newline) göre böler. Belirli bir karaktere göre bölmek için parametre vermelisiniz.
## 10.18 Split - bölme işlemi
metin = "elma,armut,muz,çilek"
meyveler = metin.split(",")
print(f"Virgülle bölünmüş: {meyveler}")
## 10.19 Birden fazla ayırıcı ile split
metin2 = "elma;armut|muz,çilek"
import re
print(f"Regex ile bölme: {re.split('[;|,]', metin2)}")
## 10.20 Join - birleştirme işlemi
birlesik = " - ".join(meyveler)
print(f"Birleştirilmiş: '{birlesik}'")
## 10.21 Partition ve rpartition
telefon = "+90-555-123-4567"
print(f"Partition: {telefon.partition('-')}")
print(f"Rpartition: {telefon.rpartition('-')}")Çıktı:
Virgülle bölünmüş: ['elma', 'armut', 'muz', 'çilek']
Regex ile bölme: ['elma', 'armut', 'muz', 'çilek']
Birleştirilmiş: 'elma - armut - muz - çilek'
Partition: ('+90', '-', '555-123-4567')
Rpartition: ('+90-555-123', '-', '4567')
Bir string’in belirli bir desenle başlayıp başlamadığını, belirli bir karakter veya kelimeyi içerip içermediğini kontrol etmek için kullanılır.
📘 Önemli Bilgi:
inoperatörü, bir string’in başka bir string içinde olup olmadığını kontrol eder. Bu işlem büyük/küçük harf duyarlıdır.
metin = "Python programlama dili Python ile yazılım geliştirme"
## 10.23 Başlangıç ve bitiş kontrolü
print(f"'Python' ile başlıyor mu?: {metin.startswith('Python')}")
print(f"'geliştirme' ile bitiyor mu?: {metin.endswith('geliştirme')}")
## 10.24 İçerik kontrolü
print(f"'Java' metinde var mı?: {'Java' in metin}")
print(f"'Python' metinde var mı?: {'Python' in metin}")
## 10.25 Sayma işlemi
print(f"'Python' kaç kez geçiyor?: {metin.count('Python')}")
print(f"'a' harfi kaç kez geçiyor?: {metin.count('a')}")Çıktı:
'Python' ile başlıyor mu?: True
'geliştirme' ile bitiyor mu?: True
'Java' metinde var mı?: False
'Python' metinde var mı?: True
'Python' kaç kez geçiyor?: 2
'a' harfi kaç kez geçiyor?: 5
Bir alt string’in konumunu bulmak için kullanılan metodlar. find() ve index() arasındaki fark, hata durumunda nasıl davrandıklarıdır.
💡 İpucu:
find()metodu, aranan değer bulunamazsa-1döndürür.index()metodu iseValueErrorhatası fırlatır. Güvenli arama içinfind()tercih edilmelidir.
metin = "Merhaba Dünya, Merhaba Evren"
## 10.26 find() metodu
print(f"İlk 'Merhaba' indeksi: {metin.find('Merhaba')}")
print(f"Son 'Merhaba' indeksi: {metin.rfind('Merhaba')}")
print(f"Bulunamayan kelime: {metin.find('Selam')}") # -1 döner
## 10.27 index() metodu
print(f"İlk 'Dünya' indeksi: {metin.index('Dünya')}")
try:
metin.index('Selam')
except ValueError as e:
print(f"Hata: {e}")
## 10.28 Belirli bir indexten sonra arama
print(f"10. indexten sonra 'Merhaba': {metin.find('Merhaba', 10)}")Çıktı:
İlk 'Merhaba' indeksi: 0
Son 'Merhaba' indeksi: 16
Bulunamayan kelime: -1
İlk 'Dünya' indeksi: 8
Hata: substring not found
10. indexten sonra 'Merhaba': 16
Bir string’in tamamen harflerden, rakamlardan veya belirli karakter tiplerinden oluşup oluşmadığını kontrol eder.
⚠️ Dikkat:
isnumeric(),isdigit()veisdecimal()metodları arasında ince farklar vardır.isnumeric()en geniş kapsamlıdır ve Roma rakamlarını, kesirleri de içerir.
testler = ["Python3", "12345", " ", "Merhaba", "3.14"]
print("Karakter Tipi Kontrolleri:")
print("-" * 50)
for test in testler:
print(f"'{test}' -> ", end="")
print(f"alpha: {test.isalpha()}, ", end="")
print(f"digit: {test.isdigit()}, ", end="")
print(f"alnum: {test.isalnum()}, ", end="")
print(f"space: {test.isspace()}")
## 10.29 Özel durumlar
print("\nÖzel Durumlar:")
print(f"'Ⅻ' (Roma rakamı) isnumeric: {'Ⅻ'.isnumeric()}")
print(f"'Ⅻ' (Roma rakamı) isdigit: {'Ⅻ'.isdigit()}")
print(f"'²' (üst simge) isdigit: {'²'.isdigit()}")
print(f"'²' (üst simge) isnumeric: {'²'.isnumeric()}")Çıktı:
Karakter Tipi Kontrolleri:
--------------------------------------------------
'Python3' -> alpha: False, digit: False, alnum: True, space: False
'12345' -> alpha: False, digit: True, alnum: True, space: False
' ' -> alpha: False, digit: False, alnum: False, space: True
'Merhaba' -> alpha: True, digit: False, alnum: True, space: False
'3.14' -> alpha: False, digit: False, alnum: False, space: False
Özel Durumlar:
'Ⅻ' (Roma rakamı) isnumeric: True
'Ⅻ' (Roma rakamı) isdigit: False
'²' (üst simge) isdigit: True
'²' (üst simge) isnumeric: True
Python 3.6 ile gelen f-string’ler, string biçimlendirmenin en modern ve okunabilir yoludur.
📘 Önemli Bilgi: f-string’ler çalışma zamanında değerlendirilir ve içlerinde herhangi bir Python ifadesi kullanılabilir.
isim = "Ali"
yas = 25
maas = 5250.50
## 10.31 Temel kullanım
print(f"Ad: {isim}, Yaş: {yas}, Maaş: {maas:.2f} TL")
## 10.32 Hizalama ve dolgu
print(f"Sağa hizalı: '{isim:>10}'")
print(f"Sola hizalı: '{isim:<10}'")
print(f"Ortala: '{isim:^10}'")
print(f"Dolgulu: '{isim:*^10}'")
## 10.33 İfade kullanımı
print(f"10 yıl sonra yaş: {yas + 10}")
print(f"İsmin uzunluğu: {len(isim)}")
## 10.34 Tarih formatlama
from datetime import datetime
bugun = datetime.now()
print(f"Bugün: {bugun:%d.%m.%Y}")
print(f"Saat: {bugun:%H:%M}")Çıktı:
Ad: Ali, Yaş: 25, Maaş: 5250.50 TL
Sağa hizalı: ' Ali'
Sola hizalı: 'Ali '
Ortala: ' Ali '
Dolgulu: '***Ali****'
10 yıl sonra yaş: 35
İsmin uzunluğu: 3
Bugün: 15.01.2024
Saat: 14:30
f-string’lerden önceki dönemde en yaygın kullanılan biçimlendirme yöntemiydi. Esnek ve güçlüdür.
💡 İpucu:
format()metodu, özellikle biçimlendirme şablonlarının dışarıdan alındığı durumlarda kullanışlıdır.
## 10.35 Konumsal parametreler
print("{} {} {} yılında doğdu.".format("Ahmet", "1980", "İstanbul"))
## 10.36 Sıra belirterek
print("{2} {0} {1} yılında doğdu.".format("Ahmet", "1980", "İstanbul"))
## 10.37 Anahtarlı parametreler
print("{ad} {soyad} - {meslek}".format(
ad="Ayşe", soyad="Yılmaz", meslek="Mühendis"))
## 10.38 Sözlük ile kullanım
kisi = {"ad": "Mehmet", "yas": 30, "sehir": "Ankara"}
print("Ad: {ad}, Yaş: {yas}, Şehir: {sehir}".format(**kisi))
## 10.39 Sayı formatlama
sayi = 1234.5678
print("Ondalık: {:.2f}".format(sayi))
print("Bilimsel: {:.2e}".format(sayi))
print("Yüzde: {:.1%}".format(0.85))Çıktı:
Ahmet 1980 İstanbul yılında doğdu.
İstanbul Ahmet 1980 yılında doğdu.
Ayşe Yılmaz - Mühendis
Ad: Mehmet, Yaş: 30, Şehir: Ankara
Ondalık: 1234.57
Bilimsel: 1.23e+03
Yüzde: 85.0%
C dili benzeri bu formatlama yöntemi, eski Python kodlarında hala görülebilir.
⚠️ Dikkat: Bu yöntem günümüzde önerilmemektedir. Yeni projelerde f-string veya
format()metodu kullanılmalıdır.
isim = "Veli"
not_ort = 85.6789
## 10.40 Temel kullanım
print("Öğrenci: %s, Not ortalaması: %.2f" % (isim, not_ort))
## 10.41 Sayı formatlama
print("Sayı: %+d" % 42)
print("Ondalık: %.3f" % 3.14159)
print("Ondalık: %8.2f" % 3.14159)
## 10.42 Farklı tipler
print("Hex: %x" % 255)
print("Oct: %o" % 255)
print("Bilimsel: %e" % 1234.5678)Çıktı:
Öğrenci: Veli, Not ortalaması: 85.68
Sayı: +42
Ondalık: 3.142
Ondalık: 3.14
Hex: ff
Oct: 377
Bilimsel: 1.234568e+03
Düzenli ifadeler (regex), metin işleme konusunda çok güçlü bir araçtır. Karmaşık desenleri kolayca tanımlayıp metin içinde arayabilirsiniz.
📘 Önemli Bilgi: Düzenli ifadeler öğrenmesi biraz zaman alsa da, metin işleme konusunda size inanılmaz bir güç kazandırır. Özellikle veri temizleme ve doğrulama işlemlerinde vazgeçilmezdir.
import re
## 10.44 Temel desen eşleştirme
metin = "Telefon: 555-123-4567, E-posta: test@ornek.com"
telefon_deseni = r'\d{3}-\d{3}-\d{4}'
eposta_deseni = r'\w+@\w+\.\w+'
telefon = re.search(telefon_deseni, metin)
eposta = re.search(eposta_deseni, metin)
print(f"Bulunan telefon: {telefon.group() if telefon else 'Bulunamadı'}")
print(f"Bulunan e-posta: {eposta.group() if eposta else 'Bulunamadı'}")
## 10.45 Metin temizleme
kirli_metin = "Merhaba!! Bu bir *** test ## metnidir."
temiz = re.sub(r'[^\w\s]', '', kirli_metin)
print(f"Temizlenmiş: {temiz}")
## 10.46 Tüm eşleşmeleri bulma
metin2 = "[email1@test.com, email2@test.com, email3@test.com]"
emailler = re.findall(r'\w+@\w+\.\w+', metin2)
print(f"Tüm e-postalar: {emailler}")
## 10.47 Gruplama
tarih_metni = "Bugün 15-01-2024"
desen = r'(\d{2})-(\d{2})-(\d{4})'
match = re.search(desen, tarih_metni)
if match:
print(f"Gün: {match.group(1)}, Ay: {match.group(2)}, Yıl: {match.group(3)}")Çıktı:
Bulunan telefon: 555-123-4567
Bulunan e-posta: test@ornek.com
Temizlenmiş: Merhaba Bu bir test metnidir
Tüm e-postalar: ['email1@test.com', 'email2@test.com', 'email3@test.com']
Gün: 15, Ay: 01, Yıl: 2024
Farklı karakter kodlamaları arasında dönüşüm yapmak, özellikle dosya işlemleri ve ağ programlamada önemlidir.
💡 İpucu: Günümüzde metin işlemlerinde UTF-8 kodlaması standarttır. ASCII sadece İngilizce karakterler için uygundur.
metin = "Merhaba Dünya 🌍"
## 10.48 Encoding (karakter -> byte)
utf8_bytes = metin.encode('utf-8')
print(f"UTF-8 bytes: {utf8_bytes}")
print(f"Byte sayısı: {len(utf8_bytes)}")
## 10.49 Decoding (byte -> karakter)
cozulmus = utf8_bytes.decode('utf-8')
print(f"Çözülmüş: {cozulmus}")
## 10.50 Farklı kodlamalar
latin1_bytes = metin.encode('latin-1', errors='replace')
print(f"Latin-1: {latin1_bytes}")
## 10.51 ASCII kontrolü
try:
metin.encode('ascii')
except UnicodeEncodeError as e:
print(f"ASCII'ye dönüştürülemez: {e}")
## 10.52 Byte string işlemleri
byte_metin = b'Python'
print(f"Byte string: {byte_metin}")
print(f"Byte'dan string'e: {byte_metin.decode('utf-8')}")Çıktı:
UTF-8 bytes: b'Merhaba D\xc3\xbcnya \xf0\x9f\x8c\x8d'
Byte sayısı: 17
Çözülmüş: Merhaba Dünya 🌍
Latin-1: b'Merhaba D\xfcnya ?'
ASCII'ye dönüştürülemez: 'ascii' codec can't encode character '\xfc' in position 9: ordinal not in range(128)
Byte string: b'Python'
Byte'dan string'e: Python
Büyük metinlerle çalışırken performans önemli bir faktördür. Doğru yöntemleri kullanmak, uygulamanızın hızını önemli ölçüde etkileyebilir.
⚠️ Dikkat: String birleştirme işlemlerinde
+operatörü yerinejoin()metodu kullanmak, özellikle çok sayıda birleştirme işleminde çok daha verimlidir.
import time
## 10.53 Performans testi fonksiyonu
def performans_testi():
# Kötü performans - + operatörü
baslangic = time.time()
sonuc = ""
for i in range(10000):
sonuc += str(i)
bitis = time.time()
print(f"+ operatörü: {bitis - baslangic:.4f} saniye")
# İyi performans - join() metodu
baslangic = time.time()
parcalar = [str(i) for i in range(10000)]
sonuc = "".join(parcalar)
bitis = time.time()
print(f"join() metodu: {bitis - baslangic:.4f} saniye")
# Liste comprehension ile join
baslangic = time.time()
sonuc = "".join(str(i) for i in range(10000))
bitis = time.time()
print(f"Generator ile join: {bitis - baslangic:.4f} saniye")
performans_testi()
## 10.54 Büyük metinlerde arama performansı
buyuk_metin = "a" * 1000000 + "b" + "a" * 1000000
## 10.55 in operatörü
baslangic = time.time()
print(f"'b' var mı?: {'b' in buyuk_metin}")
print(f"in operatörü: {time.time() - baslangic:.4f} saniye")
## 10.56 find metodu
baslangic = time.time()
print(f"'b' indeksi: {buyuk_metin.find('b')}")
print(f"find metodu: {time.time() - baslangic:.4f} saniye")Çıktı:
+ operatörü: 0.0023 saniye
join() metodu: 0.0008 saniye
Generator ile join: 0.0010 saniye
'b' var mı?: True
in operatörü: 0.0001 saniye
'b' indeksi: 1000000
find metodu: 0.0001 saniye
String işlemleriyle ilgili yaygın problemlerin çözümlerini inceleyelim.
💡 İpucu: Bu problemler, iş görüşmelerinde sıkça sorulan sorulardır. Her birini kendi başınıza çözmeye çalışarak pratik yapabilirsiniz.
```python ## 10.57 Palindrom kontrolü def palindrom_mu(metin): ““” Bir metnin palindrom olup olmadığını kontrol eder. Palindrom: Tersinden okunuşu aynı olan metin (örn: kabak, ada) ““” # Boşlukları ve noktalama işaretlerini temizle metin = ’’.join(c.lower() for c in metin if c.isalnum()) return metin == metin[::-1]
print(“Palindrom Kontrolü:”) print(f”‘kabak’ palindrom mu?: {palindrom_mu(‘kabak’)}“) print(f”‘Merhaba’ palindrom mu?: {palindrom_mu(‘Merhaba’)}“) print(f”‘Ey Edip Adana’da pide ye’ palindrom mu?: {palindrom_mu(‘Ey Edip Adana'da pide ye’)}“)
def anagram_mi(kelime1, kelime2): ““” İki kelimenin anagram olup olmadığını kontrol eder. Anagram: Harfleri yeniden düzenlenerek oluşturulmuş kelime ““” return sorted(kelime1.lower().replace(” “,”“)) == sorted(kelime2.lower().replace(” “,”“))
print(“Kontrolü:”) print(f”‘elma’ ve ‘lame’ anagram mı?: {anagram_mi(‘elma’, ‘lame’)}“) print(f”‘kitap’ ve ‘katip’ anagram mı?: {anagram_mi(‘kitap’, ‘katip’)}“) print(f”‘Roma’ ve ‘amor’ anagram mı?: {anagram_mi(‘Roma’, ‘amor’)}“)
def metin_sikistir(metin): ““” Tekrarlanan