Lewati ke konten utama

Pencarian dan Ganti String di Python: in, .find(), .index(), .count(), dan .replace()

Pola praktis untuk menemukan, menghitung, dan mengganti substring di Python modern.
Diperbarui 28 Sep 2026  · 8 mnt Baca

Jelajahi bersama AI

ChatGPTClaudePerplexity

Kita sering menggunakan .find() atau .index() untuk memeriksa apakah sebuah teks ada di dalam string—lalu menemui perilaku aneh seperti ValueError atau kecocokan yang terlewat di awal string. Sensitivitas huruf besar/kecil, batas irisan yang meleset satu, dan fakta bahwa tidak ada metode .contains() pada str menambah kebingungan. Solusinya sederhana: gunakan alat yang tepat untuk tugasnya. Andalkan operator in untuk pemeriksaan keberadaan, .find()/.index() untuk posisi, .count() untuk hitungan, dan .replace() untuk penggantian—ditambah beberapa teknik yang aman untuk Unicode saat ketidakpekaan huruf besar/kecil penting.

Cara Python Menangani Pencarian Substring

String teks Python adalah Unicode. Operasi substring peka huruf besar/kecil secara bawaan dan diimplementasikan dalam C demi kecepatan. Cara paling langsung untuk menguji apakah teks muncul di dalam sebuah string adalah operator in, yang mengembalikan Boolean menggunakan implementasi __contains__() milik string. Saat Anda membutuhkan posisi atau jumlah, gunakan metode str khusus. Parameter opsional start dan end mengikuti semantik slicing: start inklusif; end eksklusif.

Pemeriksaan keberadaan dengan in

Gunakan "needle" in haystack ketika Anda hanya peduli apakah substring tersebut ada. Cara ini mudah dibaca dan menghindari penanganan indeks.

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

Untuk pemeriksaan yang tidak peka huruf besar/kecil, normalisasi kedua sisi. .casefold() lebih sadar Unicode daripada .lower() dan menjadi pilihan utama saya untuk pencocokan tanpa peka huruf.

pattern = "ban"
print(pattern.casefold() in text.casefold())  # True
  • Kapan menggunakannya: pemeriksaan keberadaan cepat, validasi masukan, pemfilteran daftar.
  • Kasus tepi: "" in s selalu True (string kosong ada di setiap string).

Metode str.find()

Sintaks

str.find() mengembalikan indeks terendah dari substring, atau -1 jika tidak ditemukan. Parameter opsional start dan end membatasi pencarian.

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

Contoh dan kasus penggunaan

Gunakan .find() ketika Anda memerlukan posisi dan bisa menangani nilai “tidak ditemukan” tanpa pengecualian.

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

Jangan menulis if s.find(sub): untuk memeriksa keberadaan. Jika kecocokan ada di indeks 0, kondisinya bernilai falsey.

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")

Metode str.index()

Sintaks

.index() mencerminkan .find() tetapi akan memunculkan ValueError ketika substring tidak ada.

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

Contoh dan kapan memilihnya

Gunakan .index() ketika substring harus ada dan pengecualian adalah mode kegagalan yang tepat.

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

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

Metode str.count()

Sintaks

.count() mengembalikan jumlah kemunculan yang tidak saling tumpang tindih. Metode ini juga menerima batas start dan end.

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

Contoh dan kasus tepi

Gunakan .count() untuk menghitung cepat tanpa regex.

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

Kasus khusus: string kosong.

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

Metode str.replace()

.replace() mengembalikan string baru di mana kemunculan old diganti dengan new. Gunakan count untuk membatasi jumlah penggantian.

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

Mengganti substring

Metodenya tidak in-place; ia mengembalikan salinan.

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

Penggantian tidak peka huruf besar/kecil

Untuk penggantian yang tidak peka huruf besar/kecil sambil mempertahankan pola huruf, gunakan re.sub() dengan re.IGNORECASE, atau normalisasi dengan .casefold() jika Anda tidak perlu mempertahankan kapitalisasi asli.

Pencocokan Tidak Peka Huruf dengan .casefold()

.casefold() menyediakan normalisasi huruf yang agresif dan sadar Unicode, serta lebih disukai daripada .lower() untuk pemeriksaan tanpa peka huruf.

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

Alat Terkait untuk Prefiks dan Sufiks

Untuk awalan/akhiran yang sudah diketahui, gunakan metode khusus—lebih cepat dan lebih jelas daripada slicing atau regex:

  • s.startswith(prefix) dan s.endswith(suffix) (menerima tuple untuk beberapa opsi)
  • s.removeprefix(prefix) dan s.removesuffix(suffix) (Python 3.9+)
filename = "draft_report_v2.pdf"
print(filename.removeprefix("draft_"))  # report_v2.pdf
print(filename.endswith((".pdf", ".docx")))  # True

Bekerja dengan Kolom Pandas

Saat mencari banyak string dalam kolom DataFrame, gunakan metode string tervektorisasi. Atur regex=False untuk mencocokkan teks literal.

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]

Catatan:

  • Secara bawaan, regex=True, sehingga karakter khusus seperti . mencocokkan karakter apa pun kecuali Anda menonaktifkan regex.
  • Tangani null melalui na=.... Dengan StringDtype, nilai yang hilang menjadi False secara bawaan pada mask.

Jebakan Umum dan Kasus Tepi

  • Tidak ada .contains() pada str: gunakan "sub" in s. "abc".contains("a") memunculkan AttributeError.

  • Truthiness .find(): indeks 0 bernilai falsey; bandingkan dengan != -1 atau lebih suka gunakan in untuk keberadaan.

  • .index() memunculkan pengecualian: tangani ValueError jika substring mungkin tidak ada.

  • Substring kosong: "" in s adalah True; s.find("") mengembalikan 0; s.count("") adalah len(s)+1.

  • Sensitivitas huruf: semua operasi peka huruf besar/kecil kecuali Anda melakukan normalisasi atau menggunakan flag regex.

  • Bytes vs. teks: jangan mencampur bytes dan str dalam pencarian; decode atau encode agar tipenya cocok.

  • Semantik substring: "ab" in "cat,bat" adalah False meskipun "a" dan "b" muncul terpisah—kecocokan harus berdekatan.

Contoh Praktik yang Bisa Anda Jalankan

Cuplikan singkat ini menunjukkan pola yang benar dan menyoroti hal-hal yang sering menjebak.

Pemeriksaan keberadaan

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

Pencarian berbatas dengan start dan end

End bersifat eksklusif, sehingga posisi pencarian mencerminkan semantik slicing.

headline = "Where's Waldo?"
print(headline.find("Waldo", 0, 6))   # -1 (mencari pada "Where'")
print(headline.find("Waldo", 0, 13))  # 8  (mencari hingga huruf 'o' pada Waldo)

Menghitung dan mengganti

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

Contoh Latihan Pencarian dan Penggantian String di Python 

Contoh ini memproses daftar blurb film. Ini menunjukkan pemeriksaan keberadaan, pencarian berbatas, dan penggantian yang aman tanpa regex.

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)

Keluaran:

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

Kesimpulan

Gunakan operator in untuk pemeriksaan keterdapatan sederhana, .find() atau .index() saat Anda membutuhkan posisi, .count() untuk hitungan tanpa tumpang tindih, dan .replace() untuk penggantian. Lakukan normalisasi dengan .casefold() untuk pemeriksaan yang tidak peka huruf, dan pilih pembantu awalan/akhiran khusus bila sesuai. Kita menghindari mengonversi hasil .find() menjadi Boolean dan memperlakukan perilaku substring kosong sebagai kasus khusus agar kode string tetap benar dan jelas.

Topik
Python

Kursus Python

Kursus

Pengantar Python

4 jam
7.1M
Kuasai dasar-dasar analisis data dengan Python dalam 4 jam. Kursus online ini memperkenalkan antarmuka Python dan pustaka populer.
Lihat DetailRight Arrow
Mulai Kursus
Lihat SelengkapnyaRight Arrow
Terkait

blogs

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

blogs

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

blogs

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

Lihat SelengkapnyaLihat Selengkapnya