Chuyển tới nội dung chính

🐍 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 đến end - 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:

  1. Nhập vào một đoạn văn từ người dùng.
  2. Đếm số từ trong đoạn văn.
  3. In ra đoạn văn sau khi loại bỏ khoảng trắng đầu/cuối.
  4. 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:

Mở trên Colab

🔤 Bảng method xử lý chuỗi phải thuộc lòng​

MethodCông dụngVí 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ápKết quả với 1234567.891Dùng cho
{x:,.2f}1,234,567.89Tiền tệ
{x:,.0f}1,234,568Số nguyên lớn
{x:.1%}123456789.1%Phần trăm
{x:e}1.234568e+06Khoa học
{x:>15,.2f} 1,234,567.89Bả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ết print("gia tri:", gia_tri), chỉ cần print(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!