BAB 19: String
Dalami string sebagai tipe data sequence — dari slicing dan escape character hingga method manipulasi teks yang membuat programmu bisa mengolah data berbasis teks dengan presisi.
String sebenarnya bukan hal baru. Sejak BAB 4 kita sudah mencetak "Hello, World!", menyimpan nama peserta di variabel, menggunakan f-string untuk formatting, dan bahkan menjadikan string sebagai key dictionary di bab sebelumnya. Tapi selama ini kita memperlakukan string sebagai satu kesatuan utuh — mencetak, menyimpan, membandingkan. Belum pernah kita memotong string, mencari kata di dalamnya, atau mengubah huruf besar-kecilnya.
Python memperlakukan string sebagai sequence — sama seperti list dan tuple. Artinya, teknik seperti indexing, slicing, dan iterasi yang sudah kita kuasai dari BAB 14 dan 15 juga berlaku untuk string. Ditambah puluhan method bawaan khusus teks, string menjadi tipe data yang jauh lebih kaya dari kelihatannya.
Membuat String
String bisa dibuat dengan tanda kutip tunggal '...' atau ganda "..." — keduanya setara, pilih yang konsisten.
# kuis.py — dua cara menulis string
judul = "Kuis Python Dasar"
kode = 'KPD-2026'
print(judul)
print(kode)
Kuis Python Dasar
KPD-2026
Kutip tunggal berguna saat string mengandung kutip ganda, dan sebaliknya:
# kuis.py — kutip di dalam string
pesan1 = 'Peserta berkata: "Saya siap!"'
pesan2 = "It's quiz time"
print(pesan1)
print(pesan2)
Peserta berkata: "Saya siap!"
It's quiz time
String Multiline
Untuk teks yang lebih dari satu baris, gunakan triple quotes ("""...""" atau '''...'''):
# kuis.py — string multiline
aturan = """Aturan Kuis:
1. Waktu pengerjaan 30 menit
2. Tidak boleh membuka catatan
3. Jawaban bersifat final"""
print(aturan)
Aturan Kuis:
1. Waktu pengerjaan 30 menit
2. Tidak boleh membuka catatan
3. Jawaban bersifat final
Triple quotes mempertahankan semua baris baru (newline) dan spasi di dalamnya persis seperti yang ditulis.
Escape Character
Bagaimana kalau kamu butuh kutip ganda di dalam string yang sudah diapit kutip ganda? Atau ingin menyisipkan tab dan baris baru di posisi tertentu? Gunakan escape character — karakter khusus yang diawali backslash \.
# kuis.py — escape character
header = "Nama\tSkor\tStatus"
baris = "Rina\t85\tLulus"
catatan = "Aturan penting:\n- Tidak boleh curang\n- Jawaban bersifat final"
print(header)
print(baris)
print()
print(catatan)
Nama Skor Status
Rina 85 Lulus
Aturan penting:
- Tidak boleh curang
- Jawaban bersifat final
Escape character yang paling sering dipakai:
| Escape | Fungsi |
|---|---|
\n | Baris baru (newline) |
\t | Tab |
\\ | Backslash literal |
\' | Kutip tunggal |
\" | Kutip ganda |
String Sebagai Sequence
Di BAB 14 dan 15, kita belajar bahwa list dan tuple adalah sequence — kumpulan elemen yang terurut dan bisa diakses lewat index. String juga termasuk sequence, di mana setiap elemennya adalah satu karakter.
Indexing
# kuis.py — akses karakter per posisi
kode = "KPD-2026"
print(kode[0])
print(kode[3])
print(kode[-1])
print(f"Panjang: {len(kode)}")
K
-
6
Panjang: 8
Index dimulai dari 0, dan index negatif menghitung dari belakang — persis seperti list.
Slicing
Teknik slicing dari BAB 15 berlaku sepenuhnya untuk string:
# kuis.py — potong string
kode = "KPD-2026"
prefix = kode[:3]
tahun = kode[4:]
terbalik = kode[::-1]
print(f"Prefix: {prefix}")
print(f"Tahun: {tahun}")
print(f"Terbalik: {terbalik}")
Prefix: KPD
Tahun: 2026
Terbalik: 6202-DPK
Slicing string mengembalikan string baru — string asli tidak berubah. Ini penting karena string bersifat immutable, sama seperti tuple.
Immutability
Coba ubah satu karakter di string dan lihat apa yang terjadi:
# kuis.py — string tidak bisa diubah langsung
kode = "KPD-2026"
kode[0] = "X" # ini akan error
TypeError: 'str' object does not support item assignment
Error yang sama persis dengan tuple di BAB 16. String tidak bisa diubah in-place — untuk memodifikasi string, kamu harus membuat string baru. Method-method string yang akan kita pelajari selanjutnya semuanya mengembalikan string baru tanpa mengubah string asli.
Iterasi String
Karena string adalah sequence, for loop bekerja langsung:
# kuis.py — hitung berapa kali huruf vokal muncul
teks = "Kuis Python Dasar"
vokal = "aiueoAIUEO"
jumlah = 0
for huruf in teks:
if huruf in vokal:
jumlah += 1
print(f"Jumlah vokal: {jumlah}")
Jumlah vokal: 5
Pengecekan huruf in vokal memanfaatkan operator in pada string — sama seperti di list dan set, tapi yang dicek adalah apakah substring ada di dalam string.
Operator in pada String
Berbeda dari list dan set yang mengecek keanggotaan elemen tunggal, in pada string mengecek keberadaan substring — bukan hanya karakter tunggal.
# kuis.py — cek substring
judul = "Kuis Python Dasar"
print("Python" in judul)
print("Java" in judul)
print("kuis" in judul) # case-sensitive!
True
False
False
Pengecekan substring bersifat case-sensitive: "kuis" tidak ditemukan di "Kuis Python Dasar" karena huruf K besar berbeda dari k kecil. Jika perlu perbandingan yang tidak peduli besar-kecil huruf, ubah kedua string ke huruf kecil dulu dengan lower().
Method Pencarian
String punya beberapa method untuk mencari dan menghitung kemunculan substring:
# kuis.py — cari posisi dan hitung kemunculan
teks = "Kuis Python Dasar - Sesi Pagi - Kuis Ulangan"
posisi = teks.find("Kuis")
posisi_terakhir = teks.rfind("Kuis")
jumlah = teks.count("Kuis")
print(f"'Kuis' pertama di index: {posisi}")
print(f"'Kuis' terakhir di index: {posisi_terakhir}")
print(f"'Kuis' muncul {jumlah} kali")
'Kuis' pertama di index: 0
'Kuis' terakhir di index: 33
'Kuis' muncul 2 kali
find() mengembalikan -1 jika substring tidak ditemukan — aman dan tidak melempar error. Ada juga index() yang fungsinya sama tapi melempar ValueError jika tidak ditemukan, mirip perbedaan get() vs [] di dictionary.
Dua method lain untuk mengecek awal dan akhir string:
# kuis.py — cek awalan dan akhiran
nama_file = "hasil_kuis_2026.csv"
print(nama_file.startswith("hasil"))
print(nama_file.endswith(".csv"))
print(nama_file.endswith(".json"))
True
True
False
Mengubah Huruf Besar-Kecil
Method untuk mengubah case mengembalikan string baru tanpa mengubah string asli:
# kuis.py — konversi huruf besar-kecil
judul = "kuis python dasar"
print(judul.upper())
print(judul.capitalize())
print(judul.title())
judul_teriak = "KUIS PYTHON DASAR"
print(judul_teriak.lower())
KUIS PYTHON DASAR
Kuis python dasar
Kuis Python Dasar
kuis python dasar
Perbandingan singkat method-method ini:
| Method | Hasil | Contoh |
|---|---|---|
upper() | Semua huruf besar | "ABC DEF" |
lower() | Semua huruf kecil | "abc def" |
capitalize() | Huruf pertama besar | "Abc def" |
title() | Huruf pertama tiap kata besar | "Abc Def" |
swapcase() | Tukar besar-kecil | "aBC dEF" |
Mengubah ke lower() sebelum membandingkan adalah teknik standar untuk pengecekan case-insensitive:
# kuis.py — perbandingan case-insensitive
jawaban = "Python"
kunci = "python"
if jawaban.lower() == kunci.lower():
print("Jawaban benar!")
Jawaban benar!
Memotong Spasi
Data dari dunia nyata sering datang dengan spasi ekstra di awal atau akhir. Method strip() membersihkannya:
# kuis.py — bersihkan input peserta
nama_input = " Rina Wijaya "
print(f"Asli: '{nama_input}'")
print(f"strip(): '{nama_input.strip()}'")
print(f"lstrip(): '{nama_input.lstrip()}'")
print(f"rstrip(): '{nama_input.rstrip()}'")
Asli: ' Rina Wijaya '
strip(): 'Rina Wijaya'
lstrip(): 'Rina Wijaya '
rstrip(): ' Rina Wijaya'
strip() memotong kedua sisi, lstrip() hanya kiri (left), dan rstrip() hanya kanan (right).
Replace — Mengganti Substring
Method replace() mengganti semua kemunculan substring dengan string baru:
# kuis.py — koreksi teks otomatis
pengumuman = "Kuis Matematika akan diadakan hari Senin"
pengumuman_baru = pengumuman.replace("Senin", "Rabu")
print(pengumuman_baru)
# replace semua kemunculan
data = "skor:85,skor:72,skor:91"
data_bersih = data.replace("skor:", "")
print(data_bersih)
Kuis Matematika akan diadakan hari Rabu
85,72,91
Ingat: replace() mengembalikan string baru. String pengumuman asli tetap berisi “Senin” — karena string immutable.
Split dan Join
Dua method ini saling melengkapi: split() memecah string menjadi list, dan join() menggabungkan list menjadi string.
Split
# kuis.py — pecah string jadi list
data_peserta = "Rina,Budi,Sari,Dimas"
peserta = data_peserta.split(",")
print(peserta)
print(type(peserta))
['Rina', 'Budi', 'Sari', 'Dimas']
<class 'list'>
Tanpa argumen, split() memecah berdasarkan spasi (termasuk tab dan newline):
# kuis.py — split tanpa argumen
kalimat = "Kuis Python Dasar"
kata = kalimat.split()
print(kata)
['Kuis', 'Python', 'Dasar']
Spasi berlebih otomatis diabaikan — jauh lebih bersih daripada split(" ") yang akan menghasilkan string kosong di antara spasi ganda.
Join
Kebalikannya, join() menggabungkan elemen list menjadi satu string dengan separator yang ditentukan:
# kuis.py — gabung list jadi string
peserta = ["Rina", "Budi", "Sari", "Dimas"]
teks_koma = ", ".join(peserta)
teks_baris = "\n".join(peserta)
print(teks_koma)
print()
print(teks_baris)
Rina, Budi, Sari, Dimas
Rina
Budi
Sari
Dimas
Pola split() lalu join() adalah cara standar untuk membersihkan dan memformat ulang data teks. Misalnya, " ".join(teks.split()) menghilangkan semua spasi berlebih dari string.
Pengecekan Tipe Karakter
String punya beberapa method is...() yang mengembalikan True atau False berdasarkan isi string:
# kuis.py — validasi input peserta
kode_kuis = "KPD2026"
skor_input = "85"
nama = "Rina Wijaya"
print(f"'{kode_kuis}'.isalnum(): {kode_kuis.isalnum()}")
print(f"'{skor_input}'.isdigit(): {skor_input.isdigit()}")
print(f"'{nama}'.isalpha(): {nama.isalpha()}")
print(f"'{nama}'.isalpha(): False (ada spasi)")
'KPD2026'.isalnum(): True
'85'.isdigit(): True
'Rina Wijaya'.isalpha(): False (ada spasi)
Method isdigit() berguna untuk memvalidasi apakah input bisa dikonversi ke integer sebelum memanggil int() — menghindari ValueError yang tidak terduga.
String Formatting dengan f-string
Kita sudah menggunakan f-string sejak bab-bab awal, tapi kemampuannya lebih dari sekadar menyisipkan variabel. F-string mendukung ekspresi dan format specifier:
# kuis.py — format output rekap kuis
peserta = {"Rina": 85, "Budi": 72, "Sari": 91, "Dimas": 68}
print(f"{'Nama':>10} | {'Skor':>5} | {'Status':>10}")
print("-" * 32)
for nama, skor in peserta.items():
status = "Lulus" if skor >= 70 else "Tidak Lulus"
print(f"{nama:>10} | {skor:>5} | {status:>10}")
Nama | Skor | Status
--------------------------------
Rina | 85 | Lulus
Budi | 72 | Lulus
Sari | 91 | Lulus
Dimas | 68 | Tidak Lulus
Format specifier setelah tanda titik dua mengatur lebar dan perataan: >10 berarti rata kanan dengan lebar 10 karakter, <10 rata kiri, dan ^10 rata tengah. Kita sudah melihat :.1f untuk format float di bab-bab sebelumnya — semuanya bagian dari sistem yang sama.
Konversi String
Fungsi str() mengubah tipe data apapun menjadi representasi string-nya:
# kuis.py — konversi ke string
skor = 85
lulus = True
peserta = ["Rina", "Budi"]
print("Skor: " + str(skor))
print("Lulus: " + str(lulus))
print("Peserta: " + str(peserta))
Skor: 85
Lulus: True
Peserta: ['Rina', 'Budi']
Tanpa str(), menggabungkan string dengan integer menggunakan + akan melempar TypeError — karena Python tidak mengonversi tipe secara otomatis. F-string melakukan konversi ini secara implisit, yang menjadikannya cara yang lebih bersih.
Unicode dan Code Point
Semua string yang sudah kita tulis sejauh ini menggunakan huruf Latin standar — a sampai z, angka, dan beberapa simbol. Tapi Python menggunakan standar Unicode secara bawaan, yang berarti string bisa memuat karakter dari bahasa apapun di dunia: huruf Arab, aksara Jepang, simbol matematika, bahkan emoji.
# kuis.py — string Unicode
sapaan_korea = "annyeonghaseyo"
simbol = "rata-rata skor"
print(f"{sapaan_korea}: selamat datang")
print(f"{simbol} = 85.5")
annyeonghaseyo: selamat datang
rata-rata skor = 85.5
Setiap karakter di Unicode punya code point — angka unik yang mengidentifikasinya. Fungsi ord() mengembalikan code point sebuah karakter, dan chr() melakukan kebalikannya:
# kuis.py — code point karakter
print(ord("A"))
print(ord("a"))
print(ord("0"))
print(chr(65))
print(chr(97))
print(chr(48))
65
97
48
A
a
0
Huruf "A" punya code point 65, huruf "a" punya 97, dan karakter "0" (nol sebagai teks, bukan angka) punya 48. Ini menjelaskan kenapa "a" < "b" bernilai True di Python — perbandingan string sebenarnya membandingkan code point karakter per karakter.
Unicode Escape Sequence
Selain menulis karakter Unicode secara langsung, kamu bisa menggunakan escape sequence khusus untuk menyisipkan karakter berdasarkan code point-nya:
# kuis.py — Unicode escape sequence
# \uXXXX untuk karakter 16-bit (BMP)
tanda_centang = "\u2714"
tanda_silang = "\u2718"
print(f"Lulus: {tanda_centang}")
print(f"Gagal: {tanda_silang}")
# \UXXXXXXXX untuk karakter 32-bit (termasuk emoji)
bintang = "\U00002B50"
print(f"Skor sempurna: {bintang}")
# \N{NAME} menggunakan nama resmi Unicode
panah = "\N{RIGHTWARDS ARROW}"
print(f"Lanjut {panah} bab berikutnya")
Lulus: ✔
Gagal: ✘
Skor sempurna: ⭐
Lanjut → bab berikutnya
Format \uXXXX menerima tepat 4 digit hexadecimal, sedangkan \UXXXXXXXX menerima 8 digit. Notasi \N{NAME} menggunakan nama karakter Unicode resmi — lebih mudah dibaca tapi lebih panjang.
Untuk kebutuhan sehari-hari, kamu jarang perlu menulis Unicode escape secara manual. Tapi memahami bahwa string Python adalah Unicode membantumu mengolah teks multibahasa tanpa masalah encoding yang sering menjebak pemula.
Latihan
Tiga tantangan yang menggabungkan string dengan konsep dari bab-bab sebelumnya:
-
Buat string
data = "Rina:85,Budi:72,Sari:91,Dimas:68". Gunakansplit()dua kali (pertama pisah berdasarkan koma, lalu pisah setiap elemen berdasarkan titik dua) untuk mengonversi string ini menjadi dictionary{nama: skor}. Pastikan skor disimpan sebagai integer, bukan string. Cetak dictionary hasilnya. -
Kamu punya list nama peserta:
peserta = [" rina wijaya ", "BUDI santoso", " sari DEWI"]. Bersihkan setiap nama dari spasi ekstra menggunakanstrip(), lalu ubah ke format title case dengantitle(). Simpan hasilnya di list baru menggunakan list comprehension. Cetak list hasilnya. -
Buat string
teks = "Python adalah bahasa pemrograman yang populer. Python digunakan di banyak bidang. Belajar Python sangat menyenangkan.". Tanpa loop manual, temukan berapa kali kata"Python"muncul. Kemudian ganti semua kemunculan"Python"dengan"Python 3"menggunakanreplace(). Terakhir, pecah teks menjadi list kalimat menggunakansplit("."), hilangkan elemen kosong, dan cetak setiap kalimat yang sudah di-strip()di baris terpisah.
String adalah tipe data yang paling sering kita temui — mulai dari input user, pesan error, nama file, hingga data dari sumber eksternal. Dengan teknik slicing, method pencarian, operasi split()/join(), dan dukungan Unicode bawaan, kamu sekarang bisa mengolah teks dalam bahasa apapun dengan presisi yang sama seperti mengolah angka. Bicara soal angka — di BAB 8 kita hanya menyentuh permukaan tipe numerik Python. Tapi angka di Python ternyata punya banyak sisi yang belum kita eksplorasi: sistem basis bilangan, presisi floating point yang menjebak, dan bilangan kompleks untuk kalkulasi ilmiah.