Kursus
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 sselaluTrue(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)dans.endswith(suffix)(menerima tuple untuk beberapa opsi)
s.removeprefix(prefix)dans.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=.... DenganStringDtype, nilai yang hilang menjadiFalsesecara bawaan pada mask.
Jebakan Umum dan Kasus Tepi
-
Tidak ada .contains() pada str: gunakan
"sub" in s."abc".contains("a")memunculkanAttributeError.
-
Truthiness .find(): indeks
0bernilai falsey; bandingkan dengan!= -1atau lebih suka gunakaninuntuk keberadaan.
-
.index() memunculkan pengecualian: tangani
ValueErrorjika substring mungkin tidak ada.
-
Substring kosong:
"" in sadalahTrue;s.find("")mengembalikan0;s.count("")adalahlen(s)+1.
-
Sensitivitas huruf: semua operasi peka huruf besar/kecil kecuali Anda melakukan normalisasi atau menggunakan flag regex.
-
Bytes vs. teks: jangan mencampur
bytesdanstrdalam pencarian; decode atau encode agar tipenya cocok.
-
Semantik substring:
"ab" in "cat,bat"adalahFalsemeskipun"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.
