🐍 Ngày 37 - Python hằng ngày 365 ngày
🔤 Xử lý chuỗi nâng cao trong Python
Hôm nay, chúng ta sẽ khám phá các kỹ thuật xử lý chuỗi nâng cao, cực kỳ hữu ích khi thao tác với dữ liệu văn bản!
✂️ 1. Cắt chuỗi (Slicing)
s = "Huong Nghiep Du Lieu"
print(s[:5]) # 'Huong'
print(s[7:13]) # 'Nghiep'
- Cú pháp:
chuoi[start:end]— lấy từ vị trístartđếnend - 1.
🔁 2. Thay thế chuỗi con
s = "Python rất thú vị"
print(s.replace("thú vị", "tuyệt vời"))
# Output: Python rất tuyệt vời
🧹 3. Loại bỏ khoảng trắng dư
s = " Hello Python "
print(s.strip()) # 'Hello Python'
print(s.lstrip()) # 'Hello Python '
print(s.rstrip()) # ' Hello Python'
🔍 4. Tìm kiếm chuỗi
s = "Học lập trình với Python"
print("Python" in s) # True
print(s.find("lập")) # 4
🧠 Bài tập thực hành:
Viết chương trình:
- Nhập vào một đoạn văn từ người dùng.
- Đếm số từ trong đoạn văn.
- In ra đoạn văn sau khi loại bỏ khoảng trắng đầu/cuối.
- Kiểm tra xem từ "Python" có xuất hiện hay không.
✅ Kết luận:
Xử lý chuỗi là nền tảng của hầu hết mọi ứng dụng Python: từ chatbot, phân tích văn bản, cho đến xử lý dữ liệu. Càng thành thạo kỹ năng này, bạn càng tự tin khi làm việc với dữ liệu thực tế!
Bạn có thể mở bài học này trên Google Colab để chạy trực tiếp:
🔤 Bảng method xử lý chuỗi phải thuộc lòng
| Method | Công dụng | Ví dụ |
|---|---|---|
strip() | Bỏ khoảng trắng hai đầu | " abc ".strip() → "abc" |
replace(a, b) | Thay thế | "a-b".replace("-", "_") → "a_b" |
split(sep) | Tách thành list | "a,b,c".split(",") → ['a','b','c'] |
join(ds) | Ghép list thành chuỗi | "-".join(["a","b"]) → "a-b" |
upper() / lower() | Hoa / thường | "Abc".lower() → "abc" |
title() | Hoa đầu mỗi từ | "hoc python".title() → "Hoc Python" |
startswith(s) | Bắt đầu bằng | "abc".startswith("ab") → True |
endswith(s) | Kết thúc bằng | "a.txt".endswith(".txt") → True |
find(s) | Vị trí đầu tiên, -1 nếu không có | "abc".find("b") → 1 |
count(s) | Đếm số lần xuất hiện | "aaa".count("a") → 3 |
zfill(n) | Thêm số 0 bên trái | "7".zfill(3) → "007" |
center(n) | Căn giữa | "abc".center(7, "*") → "**abc**" |
⚠️ Chuỗi trong Python là bất biến. Mọi method đều trả về chuỗi mới, không sửa chuỗi gốc:
s = "abc"
s.upper()
print(s) # Vẫn là "abc" — không đổi!
s = s.upper() # Phải gán lại mới có tác dụngĐây là lỗi khiến rất nhiều người mới mất thời gian gỡ.
🎨 f-string nâng cao
from datetime import datetime
san_pham = "Bàn phím cơ"
gia = 1_250_000
ti_le = 0.075
ngay = datetime(2026, 10, 2)
# --- Định dạng số ---
print(f"{gia:,} đ") # 1,250,000 đ
print(f"{gia:,.0f} VNĐ") # 1,250,000 VNĐ
print(f"{ti_le:.1%}") # 7.5%
print(f"{ti_le:.3f}") # 0.075
print(f"{255:08b}") # 11111111 (nhị phân, 8 chữ số)
print(f"{255:x}") # ff (thập lục phân)
# --- Căn lề ---
print(f"|{san_pham:<20}|") # căn trái, rộng 20
print(f"|{san_pham:>20}|") # căn phải
print(f"|{san_pham:^20}|") # căn giữa
# --- Ngày tháng ---
print(f"{ngay:%d/%m/%Y}") # 02/10/2026
print(f"{ngay:%A, %d tháng %m năm %Y}") # In đầy đủ theo locale
# --- Debug nhanh (Python 3.8+) ---
bien_phuc_tap = {"a": 1, "b": [2, 3]}
print(f"{bien_phuc_tap=}") # bien_phuc_tap={'a': 1, 'b': [2, 3]}
Bảng định dạng số hay dùng nhất:
| Cú pháp | Kết quả với 1234567.891 | Dùng cho |
|---|---|---|
{x:,.2f} | 1,234,567.89 | Tiền tệ |
{x:,.0f} | 1,234,568 | Số nguyên lớn |
{x:.1%} | 123456789.1% | Phần trăm |
{x:e} | 1.234568e+06 | Khoa học |
{x:>15,.2f} | 1,234,567.89 | Bảng căn phải |
💡 Mẹo debug cực hữu ích:
f"{bien=}"in ra cả tên biến và giá trị. Thay vì viếtprint("gia tri:", gia_tri), chỉ cầnprint(f"{gia_tri=}").
🧹 Ứng dụng thực tế: chuẩn hoá dữ liệu bẩn
Đây là kỹ năng bạn dùng hàng ngày khi xử lý dữ liệu thật:
import re
import unicodedata
def chuan_hoa_ten(ten: str) -> str:
"""Chuẩn hoá tên người từ dữ liệu nhập tự do."""
if not ten:
return ""
# 1. Chuẩn hoá Unicode (tránh lỗi NFC vs NFD giữa các hệ điều hành)
ten = unicodedata.normalize("NFC", ten)
# 2. Bỏ khoảng trắng thừa (kể cả nhiều khoảng giữa)
ten = re.sub(r"\s+", " ", ten).strip()
# 3. Bỏ ký tự đặc biệt, chỉ giữ chữ cái, khoảng trắng và dấu
ten = re.sub(r"[^\w\s]", "", ten, flags=re.UNICODE)
# 4. Viết hoa đầu mỗi từ
return ten.title()
vi_du = [
" nguyễn văn a ",
"TRẦN THỊ B",
" lê văn c!!! ",
"Phạm Đức D",
]
for ten in vi_du:
print(f"{ten!r:30} → {chuan_hoa_ten(ten)!r}")
Bốn kỹ thuật xử lý chuỗi hay dùng
import re
text = "Lien hệ: 0912-345-678 hoặc 0987 654 321"
# 1. Regex — tìm mẫu (số điện thoại Việt Nam)
sdt = re.findall(r"0\d{2,3}[-\s]?\d{3}[-\s]?\d{3,4}", text)
print(sdt) # ['0912-345-678', '0987 654 321']
# 2. Tách và ghép
cau = "học, python, mỗi, ngày"
tu = [t.strip() for t in cau.split(",")]
print(" ".join(tu).title()) # Học Python Mỗi Ngày
# 3. Kiểm tra mật khẩu
import string
def mat_khau_manh(mk: str) -> tuple[bool, str]:
if len(mk) < 8:
return False, "Phải có ít nhất 8 ký tự"
if not any(c.islower() for c in mk):
return False, "Phải có chữ thường"
if not any(c.isupper() for c in mk):
return False, "Phải có chữ hoa"
if not any(c.isdigit() for c in mk):
return False, "Phải có chữ số"
if not any(c in string.punctuation for c in mk):
return False, "Phải có ký tự đặc biệt"
return True, "Mật khẩu mạnh"
# 4. Cắt chuỗi an toàn (tránh lỗi index out of range)
def cat_ngan(s: str, do_dai: int = 50) -> str:
return s if len(s) <= do_dai else s[: do_dai - 1].rstrip() + "…"
print(cat_ngan("Đây là một đoạn văn rất dài cần được cắt ngắn lại để hiển thị", 30))
📝 Bài tập mở rộng
Bài 1: Đếm từ
Đếm số lần xuất hiện của mỗi từ trong một đoạn văn, in ra 5 từ xuất hiện nhiều nhất.
Bài 2: Đảo ngược và kiểm tra palindrome
Kiểm tra một chuỗi có phải palindrome không (bỏ qua khoảng trắng, dấu câu, hoa thường). Ví dụ: "A man, a plan, a canal: Panama".
Bài 3: Chuẩn hoá tên file
Tên file có dấu, khoảng trắng, viết hoa — viết hàm chuyển thành dạng slug: "Báo cáo Q4 2026.pdf" → "bao-cao-q4-2026.pdf".
Bài 4: Che thông tin nhạy cảm
Viết hàm che số điện thoại (0912***678) và email (mi***@gmail.com).
🎯 Tóm tắt ngày 37
✅ Thuộc các method chuỗi quan trọng ✅ Hiểu chuỗi là bất biến — phải gán lại ✅ Dùng f-string để định dạng số, ngày, căn lề ✅ Xử lý Unicode tiếng Việt đúng cách ✅ Dùng regex để tìm mẫu thay vì vòng lặp thủ công
📅 Ngày mai, Ngày 38, chúng ta sẽ làm quen với regex (biểu thức chính quy) trong Python!