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ı

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:
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:
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\notlarTanı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:
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ı: 6Dikkat 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:
kelime = "Python"
yeni = "J" + kelime[1:]
print(yeni, kelime)
# çıktı: Jython Pythonsplit() 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:
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 - İzmirjoin() 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:
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() 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:
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:
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ı: Truereplace() 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
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:
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ünyaSonuç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:
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 FalseBir 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:
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:
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.comSık yapılan hatalar

- Metodun metni değiştirdiğini sanmak:
s.upper()tek başına bir şey yapmaz; sonucus = 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 dastr(30)kullanın. - find() sonucunu doğruluk değeri olarak kullanmak: Metin başta bulunursa
find()0 döner veif 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ı