Strings #
String adalah tipe data yang paling sering digunakan dalam hampir semua program Python — mulai dari memvalidasi input pengguna, memformat output, hingga memproses data dari file dan API. Python menyediakan dua lapisan alat untuk bekerja dengan string: method bawaan yang langsung tersedia di setiap objek str, dan modul string yang berisi konstanta dan utilitas tambahan. Memahami keduanya akan membuat kamu jauh lebih efisien saat mengolah teks.
Method Transformasi Teks #
Method di kelompok ini mengubah bentuk atau kapitalisasi string. Penting dipahami: semua method string di Python mengembalikan string baru — string aslinya tidak berubah karena string bersifat immutable.
teks = "hello world"
print(teks.upper()) # "HELLO WORLD"
print(teks.lower()) # "hello world"
print(teks.capitalize()) # "Hello world" -- hanya huruf pertama
print(teks.title()) # "Hello World" -- huruf pertama tiap kata
print(teks.swapcase()) # "HELLO WORLD" -- balik kapitalisasi
# String asli tidak berubah
print(teks) # "hello world"
title() punya satu perilaku yang perlu diperhatikan — ia menganggap karakter non-huruf sebagai pemisah kata:
print("it's a test".title()) # "It'S A Test" -- apostrophe dianggap pemisah
print("2nd place".title()) # "2Nd Place" -- angka dianggap pemisah
Jika kamu perlu kapitalisasi yang lebih cerdas, gunakan string.capwords() dari modul string (dibahas di bagian berikutnya).
Method Pencarian dan Pengecekan Posisi #
Method ini digunakan untuk mencari keberadaan substring atau mendapatkan posisinya.
kalimat = "belajar python itu menyenangkan"
# Mencari posisi substring
print(kalimat.find("python")) # 8 -- indeks pertama ditemukan
print(kalimat.find("java")) # -1 -- tidak ditemukan, kembalikan -1
print(kalimat.rfind("a")) # 28 -- cari dari kanan
# index() mirip find(), tapi raise ValueError jika tidak ditemukan
print(kalimat.index("python")) # 8
# kalimat.index("java") # ValueError: substring not found
# Cek awalan dan akhiran
print(kalimat.startswith("belajar")) # True
print(kalimat.endswith("menyenangkan")) # True
# Hitung kemunculan substring
print(kalimat.count("a")) # 4
Gunakanfind()jika tidak yakin substring ada — ia mengembalikan-1saat tidak ditemukan. Gunakanindex()hanya jika kamu yakin substring pasti ada dan ingin langsung dapat error jika tidak ditemukan.
Method Pembersihan dan Penggantian #
Digunakan untuk membersihkan input dari spasi berlebih atau mengganti bagian dari string.
# strip() -- hapus karakter di kedua ujung (default: spasi)
kotor = " hello world "
print(kotor.strip()) # "hello world"
print(kotor.lstrip()) # "hello world "
print(kotor.rstrip()) # " hello world"
# strip() bisa menerima argumen karakter yang ingin dihapus
path = "///usr/bin///"
print(path.strip("/")) # "usr/bin"
# replace() -- ganti substring
teks = "belajar java, java itu susah"
print(teks.replace("java", "python")) # "belajar python, python itu susah"
print(teks.replace("java", "python", 1)) # "belajar python, java itu susah" -- max 1 penggantian
Python 3.9 ke atas menambahkan dua method baru yang sangat berguna:
# removeprefix() dan removesuffix() -- Python 3.9+
filename = "IMG_20240101.jpg"
print(filename.removesuffix(".jpg")) # "IMG_20240101"
print(filename.removeprefix("IMG_")) # "20240101.jpg"
# ANTI-PATTERN: dulu orang melakukan ini
# if filename.endswith(".jpg"):
# filename = filename[:-4] -- rawan salah hitung indeks
# BENAR: gunakan removesuffix()
# filename = filename.removesuffix(".jpg")
Method Pemisahan dan Penggabungan #
split() dan join() adalah pasangan yang sering digunakan bersama untuk mengolah data berbentuk teks.
# split() -- pisahkan string menjadi list
kalimat = "satu dua tiga empat"
print(kalimat.split()) # ['satu', 'dua', 'tiga', 'empat']
print(kalimat.split(" ", 2)) # ['satu', 'dua', 'tiga empat'] -- max 2 split
csv_baris = "Alice,25,Jakarta"
print(csv_baris.split(",")) # ['Alice', '25', 'Jakarta']
# splitlines() -- pisahkan berdasarkan newline
multiline = "baris satu\nbaris dua\nbaris tiga"
print(multiline.splitlines()) # ['baris satu', 'baris dua', 'baris tiga']
# join() -- gabungkan list menjadi string
kata = ["belajar", "python", "itu", "seru"]
print(" ".join(kata)) # "belajar python itu seru"
print(", ".join(kata)) # "belajar, python, itu, seru"
print("".join(kata)) # "belajarpythonitueru"
# partition() -- pisahkan menjadi 3 bagian: sebelum, separator, setelah
url = "https://python.unisbadri.com/basic/variable/"
proto, sep, rest = url.partition("://")
print(proto) # "https"
print(rest) # "python.unisbadri.com/basic/variable/"
# rpartition() -- sama tapi mulai dari kanan
path = "/home/user/dokumen/laporan.pdf"
dir_path, sep, filename = path.rpartition("/")
print(filename) # "laporan.pdf"
join()jauh lebih efisien dari penggabungan string dengan+di dalam loop. Gunakan"".join(list_of_strings)untuk membangun string dari banyak bagian.
Method Validasi String #
Method yang mengembalikan True atau False untuk memeriksa isi string. Berguna untuk validasi input sebelum proses lebih lanjut.
# Cek jenis karakter
print("hello".isalpha()) # True -- semua huruf
print("hello1".isalpha()) # False -- ada angka
print("12345".isdigit()) # True -- semua digit
print("12.5".isdigit()) # False -- titik bukan digit
print("hello1".isalnum()) # True -- huruf atau angka
print("hello!".isalnum()) # False -- ada tanda seru
print(" ".isspace()) # True -- semua spasi/whitespace
# Cek kapitalisasi
print("hello".islower()) # True
print("HELLO".isupper()) # True
print("Hello World".istitle()) # True
Contoh validasi input sederhana:
def validasi_usia(input_user: str) -> int:
# ANTI-PATTERN: langsung konversi tanpa validasi
# return int(input_user) -- crash jika input bukan angka
# BENAR: validasi dulu
nilai = input_user.strip()
if not nilai.isdigit():
raise ValueError(f"Usia harus berupa angka, bukan '{nilai}'")
return int(nilai)
Method Perataan dan Padding #
Digunakan untuk memformat output agar rapi, terutama saat menampilkan tabel atau laporan di terminal.
teks = "Python"
# Perataan dengan lebar tertentu
print(teks.center(20)) # " Python "
print(teks.ljust(20)) # "Python "
print(teks.rjust(20)) # " Python"
# Bisa menentukan karakter pengisi
print(teks.center(20, "-")) # "-------Python-------"
print(teks.ljust(20, ".")) # "Python.............."
# zfill() -- padding nol di kiri, khusus untuk angka
kode = "42"
print(kode.zfill(5)) # "00042"
print("-42".zfill(5)) # "-0042" -- tanda minus tetap di kiri
String Formatting #
Python memiliki tiga cara untuk memformat string. Masing-masing punya konteks penggunaan yang berbeda.
f-string (Direkomendasikan, Python 3.6+) #
nama = "Budi"
usia = 28
saldo = 1250000.5
# Sisipkan variabel langsung
print(f"Halo, {nama}! Kamu berusia {usia} tahun.")
# Format angka
print(f"Saldo: Rp{saldo:,.2f}") # "Saldo: Rp1,250,000.50"
print(f"Persentase: {0.857:.1%}") # "Persentase: 85.7%"
print(f"Lebar 10: {nama:>10}") # " Budi"
print(f"Lebar 10: {nama:<10}") # "Budi "
print(f"Lebar 10: {nama:^10}") # " Budi "
# Ekspresi di dalam f-string
print(f"Tahun depan: {usia + 1} tahun")
print(f"Uppercase: {nama.upper()}")
# Debug print (Python 3.8+) -- sangat berguna
x = 42
print(f"{x=}") # "x=42"
str.format() (Kompatibilitas Python 2/3) #
# ANTI-PATTERN: gunakan format() untuk kode baru
template = "Halo, {}! Kamu berusia {} tahun."
print(template.format("Budi", 28))
# Gunakan f-string sebagai gantinya untuk kode baru
# print(f"Halo, {nama}! Kamu berusia {usia} tahun.")
# format() masih relevan untuk template yang disimpan sebagai string
pesan_template = "Selamat datang, {nama}! Role kamu: {role}."
print(pesan_template.format(nama="Andi", role="admin"))
% formatting (Legacy, hindari untuk kode baru) #
# ANTI-PATTERN: gaya lama, hindari di kode Python modern
print("Halo, %s! Kamu berusia %d tahun." % ("Budi", 28))
# BENAR: gunakan f-string
nama, usia = "Budi", 28
print(f"Halo, {nama}! Kamu berusia {usia} tahun.")
f-string adalah pilihan utama untuk Python 3.6+. Gunakanstr.format()hanya jika kamu perlu menyimpan template sebagai string yang diformat belakangan. Hindari%formatting di kode baru.
Modul string
#
Modul string menyediakan konstanta karakter dan utilitas yang berguna untuk operasi teks tingkat lanjut.
Konstanta Karakter #
import string
print(string.ascii_lowercase) # 'abcdefghijklmnopqrstuvwxyz'
print(string.ascii_uppercase) # 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
print(string.ascii_letters) # gabungan lower + upper
print(string.digits) # '0123456789'
print(string.hexdigits) # '0123456789abcdefABCDEF'
print(string.octdigits) # '01234567'
print(string.punctuation) # '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
print(string.whitespace) # spasi, tab, newline, dll
print(string.printable) # semua karakter yang bisa dicetak
Penggunaan nyata konstanta ini — misalnya membuat password generator atau validator karakter:
import string
import secrets
def buat_password(panjang: int = 16) -> str:
"""Buat password acak yang kuat."""
karakter = string.ascii_letters + string.digits + string.punctuation
return "".join(secrets.choice(karakter) for _ in range(panjang))
def hanya_alfanumerik(teks: str) -> bool:
"""Cek apakah string hanya berisi huruf dan angka."""
karakter_valid = string.ascii_letters + string.digits
return all(c in karakter_valid for c in teks)
print(buat_password()) # contoh: "xK#8mP2@nL5qR9!w"
print(hanya_alfanumerik("hello123")) # True
print(hanya_alfanumerik("hello!")) # False
string.capwords()
#
Berbeda dengan str.title(), fungsi capwords() lebih konsisten karena tidak menganggap tanda baca sebagai pemisah kata:
import string
# ANTI-PATTERN: title() bermasalah dengan apostrophe
print("it's a test".title()) # "It'S A Test" -- salah!
# BENAR: capwords() lebih konsisten
print(string.capwords("it's a test")) # "It's A Test"
# capwords() juga menghapus spasi berlebih
print(string.capwords(" hello world ")) # "Hello World"
string.Template
#
Template berguna untuk membuat template teks yang placeholder-nya bisa diisi nanti, terutama saat kamu tidak ingin mengeksekusi ekspresi arbitrary dari input pengguna:
from string import Template
# Buat template dengan placeholder $variabel
surat = Template("""
Kepada Yth. $nama,
Kami dengan hormat memberitahukan bahwa pendaftaran kamu
dengan ID $id_pendaftaran telah berhasil dikonfirmasi.
Hormat kami,
Tim $organisasi
""")
# Isi template
print(surat.substitute(
nama="Budi Santoso",
id_pendaftaran="REG-2024-001",
organisasi="Python Indonesia"
))
# safe_substitute() -- tidak crash jika ada placeholder yang tidak diisi
template_parsial = Template("Halo $nama, kode kamu: $kode")
print(template_parsial.safe_substitute(nama="Andi"))
# "Halo Andi, kode kamu: $kode" -- $kode dibiarkan apa adanya
Jangan gunakan f-string untuk template yang placeholder-nya berasal dari input pengguna yang tidak dipercaya. Gunakanstring.Templateataustr.format_map()agar lebih aman karena tidak mengeksekusi ekspresi Python arbitrary.
Ringkasan #
- String bersifat immutable — semua method mengembalikan string baru, tidak mengubah string asli.
- Transformasi: gunakan
upper(),lower(),capitalize(),title()untuk mengubah kapitalisasi;strip(),lstrip(),rstrip()untuk membersihkan whitespace.- Pencarian: gunakan
find()jika tidak yakin substring ada (kembalikan -1), gunakanindex()jika yakin ada dan ingin error jika tidak.- split() dan join() adalah pasangan utama untuk memecah dan menggabungkan teks;
join()lebih efisien dari penggabungan+dalam loop.- Python 3.9+:
removeprefix()danremovesuffix()lebih aman dari slicing manual untuk menghapus awalan/akhiran.- Formatting: gunakan f-string untuk kode baru (Python 3.6+),
str.format()untuk template yang disimpan, hindari%formatting.- Modul
string: konstantaascii_letters,digits,punctuationberguna untuk validasi karakter;capwords()lebih konsisten darititle();Templateaman untuk template dari input eksternal.