Ana içeriğe geç

Python Dizede Arama ve Değiştirme: in, .find(), .index(), .count() ve .replace()

Modern Python’da alt dizeleri bulma, sayma ve değiştirme için pratik kalıplar.
· 8 dk. oku

Yapay Zeka ile Keşfedin

Bir metnin bir dize içinde var olup olmadığını kontrol etmek için .find() veya .index() kullanmak yaygındır—ve ardından bir ValueError ya da dizenin başındaki bir eşleşmenin kaçırılması gibi garip davranışlarla karşılaşılır. Büyük/küçük harf duyarlılığı, bir farkla kaçan dilim sınırları ve str üzerinde bir .contains() yönteminin olmaması kafa karışıklığını artırır. Çözüm basittir: işe uygun aracı kullanın. Varlık kontrolleri için in işleçine, konumlar için .find()/.index()’e, sayımlar için .count()’a ve ikameler için .replace()’e güveniriz—ayrıca büyük/küçük harf duyarsızlığı önemli olduğunda birkaç Unicode güvenli tekniğe başvururuz.

Python Alt Dize Aramasını Nasıl Ele Alır

Python’un metin dizeleri Unicode’dur. Alt dize işlemleri varsayılan olarak büyük/küçük harfe duyarlıdır ve hız için C’de uygulanmıştır. Bir metnin bir dize içinde görünüp görünmediğini test etmenin en doğrudan yolu, dizenin __contains__() uygulamasını kullanan bir Boolean döndüren in işleçidir. Konumlara veya sayılara ihtiyaç duyduğunuzda özel str yöntemlerini kullanın. İsteğe bağlı start ve end parametreleri dilim semantiğini izler: başlangıç dahil; bitiş hariçtir.

in ile kapsama

Yalnızca alt dizenin var olup olmadığına önem veriyorsanız "needle" in haystack kullanın. Okunabilir ve indeks işlemeyi önler.

text = "Banana bread"
print("ban" in text)   # False (case-sensitive)
print("Ban" in text)   # True

Büyük/küçük harf duyarsız kontroller için, her iki tarafı da normalize edin. .casefold(), .lower()’dan daha Unicode farkındadır ve benim harf duyarsız eşleştirme için varsayılan tercihimdir.

pattern = "ban"
print(pattern.casefold() in text.casefold())  # True
  • Ne zaman kullanılır: hızlı varlık kontrolleri, girdi doğrulama, liste filtreleme.
  • Köşe durum: "" in s her zaman True’dur (boş dize her dizenin içindedir).

str.find() yöntemi

Sözdizimi

str.find(), alt dizenin en düşük indeksini döndürür; bulunamazsa -1 döndürür. İsteğe bağlı start ve end aramayı sınırlar.

s.find(substring, start=0, end=len(s))

Örnekler ve kullanım alanları

Konuma ihtiyaç duyduğunuzda ve “bulunamadı” değerini istisna olmadan ele alabileceğiniz durumlarda .find() kullanın.

tagline = "Ship fast. Fix faster."
print(tagline.find("fast"))         # 5
print(tagline.find("fast", 6))      # 16
print(tagline.find("slow"))         # -1

Varlık kontrolü için if s.find(sub): yazmayın. Eşleşme indeks 0’daysa, koşul falsey olur.

name = "Alice"
if name.find("A"):         # Wrong: 0 is Falsey
    print("Found A")       # Will not run
if name.find("A") != -1:   # Correct
    print("Found A")

str.index() yöntemi

Sözdizimi

.index(), .find() ile aynıdır ancak alt dize yoksa ValueError fırlatır.

s.index(substring, start=0, end=len(s))

Örnekler ve ne zaman seçilmeli

Alt dizenin mutlaka var olması gerektiğinde ve doğru hata modu bir istisna olduğunda .index() kullanın.

product = "USB-C Cable"
print(product.index("Cable"))  # 6

try:
    product.index("HDMI")
except ValueError:
    print("Required label missing")

str.count() yöntemi

Sözdizimi

.count(), çakışmayan yinelemelerin sayısını döndürür. start ve end sınırlarını da kabul eder.

s.count(substring, start=0, end=len(s))

Örnekler ve uç durumlar

Regex olmadan hızlı sayımlar için .count() kullanın.

log_line = "ERROR: timeout. ERROR: retry. ERROR: gave up."
print(log_line.count("ERROR"))     # 3
print(log_line.count("WARN"))      # 0

Özel durum: boş dize.

print("abc".count(""))   # 4 (len(s) + 1)

str.replace() yöntemi

.replace(), old oluşumlarının new ile değiştirildiği yeni bir dize döndürür. Değiştirmeleri sınırlamak için count kullanın.

s.replace(old, new, count=-1)

Alt dizeleri değiştirme

Yöntem yerinde çalışmaz; bir kopya döndürür.

message = "The red house is between the blue house and the old house"
print(message.replace("house", "car"))
# The red car is between the blue car and the old car

print(message.replace("house", "car", 2))
# The red car is between the blue car and the old house

Büyük/küçük harf duyarsız değiştirme

Büyük/küçük harf duyarsız değiştirmelerde, harf desenlerini korumak istiyorsanız re.IGNORECASE ile re.sub() kullanın; orijinal büyük/küçük harfi korumanız gerekmiyorsa .casefold() ile normalize edin.

.casefold() ile Büyük/Küçük Harf Duyarsız Eşleştirme

.casefold(), agresif, Unicode farkındalığı olan bir harf normalleştirme sağlar ve harf duyarsız kontroller için .lower() yerine tercih edilir.

query = "straße"           # German 'straße'
text  = "STRASSE und mehr" # Uppercase variant
print(query.casefold() in text.casefold())  # True

Ön Ek ve Son Ekler İçin İlgili Araçlar

Bilinen başlangıç/bitişler için özel yöntemleri kullanın—dilimlemeden veya regex’ten daha hızlı ve daha nettirler:

  • s.startswith(prefix) ve s.endswith(suffix) (birden çok seçenek için demet kabul eder)
  • s.removeprefix(prefix) ve s.removesuffix(suffix) (Python 3.9+)
filename = "draft_report_v2.pdf"
print(filename.removeprefix("draft_"))  # report_v2.pdf
print(filename.endswith((".pdf", ".docx")))  # True

Pandas Sütunlarıyla Çalışma

Bir DataFrame sütununda çok sayıda dize ararken vektörleşmiş dize yöntemlerini kullanın. Salt metin eşleştirmek için regex=False ayarlayın.

import pandas as pd

cities = pd.Series(["New York", "Yorktown", None, "Toronto"], dtype="string")
mask = cities.str.contains("York", regex=False, na=False)
print(mask.tolist())  # [True, True, False, False]

Notlar:

  • Varsayılan olarak regex=True’dir; bu nedenle . gibi özel karakterler, regex’i devre dışı bırakmadığınız sürece herhangi bir karakterle eşleşir.
  • Null değerleri na=... ile yönetin. StringDtype ile, eksik değerler maskede varsayılan olarak False olur.

Yaygın Tuzaklar ve Uç Durumlar

  • str üzerinde .contains() yok: "sub" in s kullanın. "abc".contains("a") AttributeError yükseltir.

  • .find()’in doğruluk değeri: indeks 0 falsey’dir; != -1 ile karşılaştırın ya da varlık için in’i tercih edin.

  • .index() istisna fırlatır: alt dize yok olabilir ise ValueError’ı yönetin.

  • Boş alt dize: "" in s True’dur; s.find("") 0 döndürür; s.count("") len(s)+1’dir.

  • Büyük/küçük harf duyarlılığı: siz normalize etmedikçe veya regex bayrakları kullanmadıkça tüm işlemler büyük/küçük harfe duyarlıdır.

  • Bayt vs. metin: aramalarda bytes ve str’ı karıştırmayın; türleri eşlemek için decode veya encode edin.

  • Alt dize semantiği: "ab" in "cat,bat" False’tur; "a" ve "b" ayrı ayrı görünse bile—eşleşmeler bitişik olmalıdır.

Çalıştırabileceğiniz Uygulamalı Örnekler

Bu kısa parçalar doğru kalıpları gösterir ve yaygın tuzakları vurgular.

Varlık kontrolleri

headline = "Where's Waldo?"
print("Waldo" in headline)          # True
print("Wenda" in headline)          # False
print(headline.find("Waldo"))       # 8
print(headline.find("Wenda"))       # -1

start ve end ile sınırlı arama

Bitiş hariçtir; bu nedenle arama konumları dilim semantiğini yansıtır.

headline = "Where's Waldo?"
print(headline.find("Waldo", 0, 6))   # -1 (searching "Where'")
print(headline.find("Waldo", 0, 13))  # 8  (searching up to the 'o' in Waldo)

Sayma ve değiştirme

inventory = "apple, apple, pear, apple"
print(inventory.count("apple"))                # 3
print(inventory.replace("apple", "orange", 2)) # orange, orange, pear, apple

Python Dizede Arama ve Değiştirme Uygulama Örneği 

Bu örnek bir film kısa açıklamaları listesini işler. Varlık kontrollerini, sınırlı aramaları ve regex olmadan güvenli değiştirmeleri gösterir.

blurbs = [
    "Critics say the lead actor delivers a career-best performance.",
    "Fans argue the actor actor scene was intentionally repetitive.",
    "A clever cameo steals the show."
]

for blurb in blurbs:
    # Check whether "actor" appears between indexes 20 and 40 (end exclusive).
    window_has_actor = "actor".casefold() in blurb[20:40].casefold()
    if not window_has_actor:
        print("Window check: actor not found")
        continue

    # If "actor actor" appears, collapse to a single "actor".
    if "actor actor" in blurb:
        print(blurb.replace("actor actor", "actor"))
    # If "actor actor actor" appears, collapse to a single "actor".
    elif "actor actor actor" in blurb:
        print(blurb.replace("actor actor actor", "actor"))
    else:
        print(blurb)

Çıktı:

Window check: actor not found
Fans argue the actor scene was intentionally repetitive.
Window check: actor not found

Sonuç

in işleçini basit kapsama için, konumlara ihtiyaç duyduğunuzda .find() veya .index()’i, çakışmayan sayımlar için .count()’u ve ikameler için .replace()’i kullanın. Büyük/küçük harf duyarsız kontroller için .casefold() ile normalize edin ve uygun olduğunda özel ön ek/son ek yardımcılarını tercih edin. Dize kodunun doğru ve net kalması için .find() sonuçlarını Boolean’a dönüştürmekten kaçınır ve boş alt dize davranışını özel bir durum olarak ele alırız.

Konular

İlgili