Python'da metinler str tipindedir ve değiştirilemez Unicode karakter dizileridir; bu yüzden upper(), replace(), strip() gibi bütün string metotları orijinal metni değiştirmez, yeni bir metin döndürür. En sık kullanılanlar metni parçalara ayıran split(), parçaları birleştiren join(), baştaki ve sondaki boşlukları silen strip(), bir alt metni değiştiren replace(), arayan find() ile in operatörü ve büyük/küçük harf dönüşümü yapan upper(), lower(), casefold() metotlarıdır.

Bu yazı Built-in Types sayfasındaki string metotları bölümüne ve Tutorial'ın metin anlatımına dayanıyor. İndeksleme ve dilimlemeden başlayıp en kullanışlı metotları gruplar hâlinde gösteriyor; strip() ile removeprefix() arasındaki sinsi farkı, split() fonksiyonunun iki farklı algoritmasını ve Türkçedeki İ/ı harflerinin neden beklenmedik sonuç verdiğini örneklerle açıklıyor. Metin biçimlendirme f-string yazısında, serinin tamamı Python öğrenme rehberi sayfasında.

Metin yazmanın yolları

Metin yazmanın yolları

Metinler tek tırnak ya da çift tırnak arasına yazılır ve ikisi aynı sonucu verir. Metnin içinde aynı tür tırnak kullanacaksanız ya diğer türü seçersiniz ya da tırnağı ters eğik çizgiyle kaçırırsınız. Çok satırlı metinler için üç tırnak kullanılır; satır sonları metne dahil olur. Parantez içinde yan yana yazılan metin sabitleri otomatik olarak birleştirilir, bu da uzun metinleri bölmek için kullanışlıdır. * operatörü bir metni tekrarlar:

python
mesaj = ("Uzun bir metni "
         "parçalara bölüp "
         "yan yana yazabilirsiniz.")
print(mesaj)
cok_satir = """Birinci satır
İkinci satır"""
print(cok_satir)
print("ha" * 3 + "!")
# çıktı: Uzun bir metni parçalara bölüp yan yana yazabilirsiniz.
# çıktı: Birinci satır
# çıktı: İkinci satır
# çıktı: hahaha!

Kaçış dizileri ve ham metin

Ters eğik çizgi (\) özel karakterleri başlatır: \n satır sonu, \t sekme demektir. Windows dosya yollarında bu durum sürpriz yaratır, çünkü C:\temp içindeki \t bir sekmeye dönüşür. Çözüm ya ters eğik çizgiyi iki kez yazmak ya da metnin başına r koyarak ham metin (raw string) kullanmaktır:

python
print('C:\temp\notlar')
print(r'C:\temp\notlar')
print('C:\\temp\\notlar')
# çıktı: C:	emp
# çıktı: otlar
# çıktı: C:\temp\notlar
# çıktı: C:\temp\notlar

Tanınmayan bir kaçış dizisi (örneğin "C:\yeni" içindeki \y) şimdilik metinde olduğu gibi kalır ama Python 3.15.2 derleme sırasında şu uyarıyı verir: SyntaxWarning: "\y" is an invalid escape sequence. Such sequences will not work in the future. Did you mean "\\y"? A raw string is also an option. Dosya yollarıyla çalışırken pathlib kullanmak bu sorunların çoğunu ortadan kaldırır.

İndeksleme ve dilimleme

Bir metnin karakterlerine sıfırdan başlayan indekslerle erişirsiniz; Python'da ayrı bir karakter tipi yoktur, tek bir karakter de uzunluğu 1 olan bir metindir. Negatif indeksler sondan sayar: -1 son karakterdir. Dilimleme s[baslangic:bitis:adim] biçimindedir; başlangıç dahil, bitiş hariçtir. Bu kural sayesinde s[:i] + s[i:] her zaman s'ye eşittir. Adım olarak -1 vermek metni ters çevirir:

python
kelime = "Python"
print(kelime[0], kelime[-1])
print(kelime[0:2], kelime[2:], kelime[-2:])
print(kelime[::-1])
print(kelime[::2])
print(kelime[4:42], repr(kelime[42:]))
print(len(kelime))
# çıktı: P n
# çıktı: Py thon on
# çıktı: nohtyP
# çıktı: Pto
# çıktı: on ''
# çıktı: 6

Dikkat edin: dilimlemede aralık dışı indeksler sessizce kırpılır ve boş metin döner, ama tek bir aralık dışı indeks hata verir. kelime[42] için Python 3.15.2 IndexError: string index out of range mesajını gösterir. Metinler değiştirilemez olduğundan kelime[0] = "J" de TypeError verir; yeni bir metin oluşturmanız gerekir:

python
kelime = "Python"
yeni = "J" + kelime[1:]
print(yeni, kelime)
# çıktı: Jython Python

split() ve join(): parçala ve birleştir

split(sep) metni verilen ayırıcıdan böler ve bir liste döndürür. Belgelere göre iki farklı davranışı vardır. Ayırıcı verildiğinde ardışık ayırıcılar gruplanmaz ve aralarında boş metinler oluşur; boş bir metni bölmek [''] verir. Ayırıcı verilmediğinde ise ardışık boşluklar tek ayırıcı sayılır, baştaki ve sondaki boşluklar yok sayılır ve boş metin [] verir. maxsplit en fazla kaç bölme yapılacağını sınırlar. join() ise bunun tersidir: ayırıcı metnin metodudur ve argüman olarak bir metin listesi alır:

python
satir = "elma,armut,,kiraz"
print(satir.split(","))
print(satir.split(",", maxsplit=1))
print("  bir   iki  üç ".split())
print("".split(","))
print("".split())
print(" - ".join(["İstanbul", "Ankara", "İzmir"]))
# çıktı: ['elma', 'armut', '', 'kiraz']
# çıktı: ['elma', 'armut,,kiraz']
# çıktı: ['bir', 'iki', 'üç']
# çıktı: ['']
# çıktı: []
# çıktı: İstanbul - Ankara - İzmir

join() listedeki her öğenin metin olmasını ister; sayı içeren bir liste verirseniz TypeError: sequence item 0: expected str instance, int found hatası alırsınız. Çözüm, öğeleri önce dönüştürmektir: ", ".join(str(x) for x in sayilar). Birden çok farklı ayırıcıyla bölmeniz gerekiyorsa belgeler re.split() fonksiyonunu önerir (bkz. re modülü). Satırlara bölmek için ise splitlines() vardır.

Döngüde + ile birleştirmek yerine join()

Metinler değiştirilemez olduğu için her + birleştirmesi yeni bir nesne oluşturur. Belgeler, değiştirilemez dizileri art arda birleştirerek büyütmenin toplam uzunlukla karesel orantılı maliyet getirdiğini belirtir ve parçaları bir listeye toplayıp sonda join() ile birleştirmeyi ya da io.StringIO kullanmayı önerir:

python
parcalar = []
for i in range(5):
    parcalar.append(f"satır {i}")
metin = "\n".join(parcalar)
print(metin)
print(metin.splitlines())
# çıktı: satır 0
# çıktı: satır 1
# çıktı: satır 2
# çıktı: satır 3
# çıktı: satır 4
# çıktı: ['satır 0', 'satır 1', 'satır 2', 'satır 3', 'satır 4']

strip() ailesi ve removeprefix() farkı

strip() ailesi ve removeprefix() farkı

strip() baştaki ve sondaki boşlukları, lstrip() yalnızca baştakileri, rstrip() yalnızca sondakileri siler. Argüman verdiğinizde ise önemli bir ayrıntı devreye girer: argüman bir önek ya da sonek değil, silinecek karakterlerin kümesidir. Python bu kümedeki karakterleri, kümede olmayan bir karakterle karşılaşana kadar uçlardan siler. Belirli bir öneki ya da soneki bir kez silmek için Python 3.9'da eklenen removeprefix() ve removesuffix() metotlarını kullanmalısınız:

python
print(repr("   merhaba   ".strip()))
print(repr("   merhaba   ".lstrip()))
print("test.txt".rstrip(".txt"))
print("test.txt".removesuffix(".txt"))
print("kod_kodlama".lstrip("kod_"))
print("kod_kodlama".removeprefix("kod_"))
print("...!Merhaba!...".strip(".!"))
# çıktı: 'merhaba'
# çıktı: 'merhaba   '
# çıktı: tes
# çıktı: test
# çıktı: lama
# çıktı: kodlama
# çıktı: Merhaba

"test.txt".rstrip(".txt") sonucunun tes olması bu yazının en önemli uyarısıdır: t harfi de kümede olduğu için silinmeye devam edilmiştir. Dosya uzantısı kaldırmak gibi işlerde removesuffix() ya da pathlib içindeki Path.stem doğru araçtır.

Arama, sayma ve değiştirme

find() alt metnin ilk geçtiği indeksi, bulamazsa -1 döndürür; index() aynı işi yapar ama bulamazsa ValueError: substring not found hatası verir. Belgeler, yalnızca bir alt metnin var olup olmadığını sınamak için find() yerine in operatörünü önerir. count() örtüşmeyen tekrar sayısını, replace(eski, yeni, sayi) değiştirilmiş yeni bir metni döndürür. startswith() ve endswith() bir tuple da kabul eder, böylece birkaç olasılığı tek çağrıda sınayabilirsiniz:

python
cumle = "bir iki bir üç bir"
print(cumle.replace("bir", "1"))
print(cumle.replace("bir", "1", 2))
print(cumle.count("bir"))
print(cumle.find("üç"), cumle.find("dört"))
print("iki" in cumle)
print(cumle.startswith(("bir", "iki")))
print(cumle.endswith("bir"))
# çıktı: 1 iki 1 üç 1
# çıktı: 1 iki 1 üç bir
# çıktı: 3
# çıktı: 12 -1
# çıktı: True
# çıktı: True
# çıktı: True

replace() metodunun count parametresi Python 3.13'ten beri anahtar kelime argümanı olarak da verilebilir: cumle.replace("bir", "1", count=2). partition() metni ilk ayırıcıdan üç parçaya böler ve ayırıcı bulunamazsa hata vermez; rpartition() aynı işi sondan yapar. Bu ikisi "anahtar=değer" gibi satırları ayrıştırmak için çok pratiktir.

Hizalama ve doldurma

python
print("anahtar=değer=ek".partition("="))
print("anahtar=değer=ek".rpartition("="))
print("42".zfill(5), "-42".zfill(5))
print("Python".center(12, "*"))
print("ad".ljust(6) + "|" + "soyad".rjust(8) + "|")
# çıktı: ('anahtar', '=', 'değer=ek')
# çıktı: ('anahtar=değer', '=', 'ek')
# çıktı: 00042 -0042
# çıktı: ***Python***
# çıktı: ad    |   soyad|

zfill() başa sıfır ekler ve işareti korur, center(), ljust(), rjust() metni belirtilen genişliğe doldurur. Genişlik metnin uzunluğundan küçükse metin olduğu gibi döner. Tablo biçiminde çıktı üretirken f-string'deki {ad:<10} gibi hizalama belirteçleri genellikle daha okunaklıdır.

Büyük/küçük harf ve Türkçe karakterler

upper(), lower(), title(), capitalize() ve swapcase() harf dönüşümü yapar. Bu metotlar Unicode standardının varsayılan dönüşüm kurallarını kullanır ve dile göre değişmez. Türkçe için bunun sonucu önemlidir: Unicode'un varsayılan kurallarında küçük i büyük I'ya, büyük I küçük i'ye dönüşür. Türkçedeki noktalı büyük İ ve noktasız küçük ı ayrı karakterlerdir:

python
print("istanbul".upper())
print("ISPARTA".lower())
print("İ".lower(), len("İ".lower()))
print("ılık".upper())
print("straße".casefold())
print("merhaba dünya".title())
print("merhaba DÜNYA".capitalize())
# çıktı: ISTANBUL
# çıktı: isparta
# çıktı: i̇ 2
# çıktı: ILIK
# çıktı: strasse
# çıktı: Merhaba Dünya
# çıktı: Merhaba dünya

Sonuçlara dikkat edin: "istanbul" büyütüldüğünde "İSTANBUL" değil "ISTANBUL" oluyor; "ISPARTA" küçültüldüğünde "ısparta" değil "isparta" oluyor. "İ" küçültüldüğünde ise sonuç iki karakterlik bir metin: i ve birleşen nokta işareti. casefold(), büyük/küçük harf duyarsız karşılaştırma için tasarlanmış daha agresif bir küçültmedir; belgelerdeki örnekte Almanca "ß" harfi "ss" olur. Türkçe metinlerde doğru dönüşüm için önce İ ve ı harflerini elle eşlemek gerekir; bunun yöntemleri Unicode ve Türkçe karakterler yazısında anlatılıyor.

Karakter sınıfı sınamaları

isalpha(), isdigit(), isdecimal(), isnumeric(), isalnum(), isspace() gibi metotlar metnin tüm karakterlerinin belirli bir sınıfa ait olup olmadığını döndürür. Sayı sınamaları arasındaki fark ince ama önemlidir: isdecimal() yalnızca onluk rakamları, isdigit() buna üst simge rakamları da, isnumeric() ise kesir karakterleri gibi sayısal değeri olan her şeyi kabul eder. Hiçbiri nokta ya da eksi işaretini rakam saymaz:

python
for s in ["123", "²", "½", "12.5", "çiğdem", "abc123", " "]:
    print(repr(s), s.isdecimal(), s.isdigit(), s.isnumeric(), s.isalpha(), s.isalnum())
# çıktı: '123' True True True False True
# çıktı: '²' False True True False True
# çıktı: '½' False False True False True
# çıktı: '12.5' False False False False False
# çıktı: 'çiğdem' False False False True True
# çıktı: 'abc123' False False False False True
# çıktı: ' ' False False False False False

Bir girdinin int() ile dönüştürülebilir olup olmadığını bu metotlarla kesin olarak anlayamazsınız; örneğin "²".isdigit() doğru döner ama int("²") hata verir. En güvenilir yöntem dönüşümü denemek ve hatayı yakalamaktır (bkz. try/except).

Karşılaştırma ve sıralama

Metinler, karakterlerinin Unicode kod noktalarına (ord() değerlerine) göre sözlük sırasıyla karşılaştırılır. Bu yüzden bütün büyük ASCII harfler küçük harflerden önce gelir ve Türkçe harfler ASCII harflerinden sonra sıralanır:

python
print(ord("ç"), chr(231))
print("a" < "b", "Z" < "a", "ç" > "z")
print(sorted(["çilek", "armut", "zeytin", "elma"]))
# çıktı: 231 ç
# çıktı: True True True
# çıktı: ['armut', 'elma', 'zeytin', 'çilek']

"çilek" kelimesinin "zeytin"den sonra gelmesi Türkçe alfabeye göre yanlıştır. Doğru Türkçe sıralama için sorted() fonksiyonuna bir key fonksiyonu vermeniz gerekir; sorted ve key yazısı bu tekniği gösteriyor.

Gerçek bir örnek: girdiyi temizlemek

Metotlar genellikle zincir hâlinde kullanılır, çünkü her biri yeni bir metin döndürür. Aşağıdaki örnek bir dosya adının uzantısını büyük/küçük harf duyarsız sınıyor, adı ve uzantıyı ayırıyor ve bir e-posta adresini normalleştiriyor:

python
dosya = "rapor_2026.PDF"
print(dosya.lower().endswith((".pdf", ".docx")))
ad, _, uzanti = dosya.rpartition(".")
print(ad, uzanti)
print("  E-Posta@Ornek.COM ".strip().lower())
# çıktı: True
# çıktı: rapor_2026 PDF
# çıktı: e-posta@ornek.com

Sık yapılan hatalar

Sık yapılan hatalar: Metodun metni değiştirdiğini sanmak, strip() fonksiyonuna önek vermek, Metinle sayıyı + ile birleştirmek, find() sonucunu doğruluk değeri olarak kullanmak
  • Metodun metni değiştirdiğini sanmak: s.upper() tek başına bir şey yapmaz; sonucu s = s.upper() ile atamanız gerekir.
  • strip() fonksiyonuna önek vermek: Argüman bir karakter kümesidir; önek ya da sonek için removeprefix()/removesuffix() kullanın.
  • Metinle sayıyı + ile birleştirmek: "Yaş: " + 30 şu hatayı verir: TypeError: can only concatenate str (not "int") to str. f-string ya da str(30) kullanın.
  • find() sonucunu doğruluk değeri olarak kullanmak: Metin başta bulunursa find() 0 döner ve if s.find(x): yanlış çalışır. if x in s: yazın.
  • Türkçe harflerde lower()/upper() güvenmek: İ ve ı için sonuçlar Türkçe kurallara uymaz.

Sık Sorulan Sorular

Bir metni nasıl ters çeviririm?

Dilimlemeyle s[::-1] yazmanız yeterlidir. reversed(s) bir yineleyici döndürür; metin elde etmek için "".join(reversed(s)) gerekir.

Bir metnin içinde bir kelime olup olmadığını nasıl anlarım?

"kelime" in metin ifadesi alt metin araması yapar ve True/False döndürür. Yalnızca tam kelime eşleşmesi istiyorsanız önce split() ile kelimelere bölün ya da re modülündeki kelime sınırlarını kullanın.

str ile bytes farkı nedir?

str Unicode metindir, bytes ise ham bayt dizisidir. Dosyadan ya da ağdan gelen baytları metne çevirmek için decode(), metni bayta çevirmek için encode() kullanılır. Ayrıntılar Unicode yazısında.

Bir metnin boş ya da yalnızca boşluk olup olmadığını nasıl anlarım?

if not s.strip(): hem boş metni hem de yalnızca boşluk, sekme ve satır sonundan oluşan metni yakalar. isspace() de kullanılabilir ama belgelere göre en az bir karakter ister; "".isspace() yanlış, " \t\n".isspace() doğru döner. Form girdilerini doğrularken bu fark önemlidir, çünkü boş alan ile yalnızca boşluk girilmiş alan genellikle aynı muameleyi görmelidir.

Tüm metotları nerede görebilirim?

Built-in Types sayfasının "String Methods" bölümü bütün metotları imzalarıyla listeler. Etkileşimli kabukta dir(str) ve help(str.split) de hızlı bir başvuru sağlar (bkz. REPL).

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: Python öğrenme rehberi · f-string biçimlendirme · Unicode ve Türkçe karakterler · re modülü · Liste metotları