Skip to content

🛠️ 13.2 Xử lý và định dạng chuỗi

📖 Giới thiệu

Xử lý và định dạng chuỗi là kỹ năng quan trọng trong lập trình. Python cung cấp nhiều phương thức mạnh mẽ để thao tác với chuỗi một cách hiệu quả và linh hoạt.

INFO

Python có hàng chục phương thức xử lý chuỗi, từ cơ bản đến nâng cao

✂️ Cắt và ghép chuỗi

🔗 split() và join() nâng cao

python
# Phân tích dữ liệu CSV đơn giản
du_lieu_csv = "Nguyễn Văn An,25,Hà Nội,Developer,15000000"
thong_tin = du_lieu_csv.split(",")

print("👤 Thông tin nhân viên:")
labels = ["Tên", "Tuổi", "Địa chỉ", "Nghề nghiệp", "Lương"]
for label, value in zip(labels, thong_tin):
    print(f"  {label}: {value}")

# Ghép lại thành format khác
thong_tin_formatted = " | ".join(thong_tin)
print(f"\n📋 Format mới: {thong_tin_formatted}")

# Xử lý text có nhiều ký tự phân cách
text_phuc_tap = "python;java,javascript|c++:ruby"
# Thay thế tất cả ký tự phân cách thành 1 loại
import re
ngon_ngu = re.split('[;,|:]', text_phuc_tap)
print(f"🔤 Ngôn ngữ: {ngon_ngu}")

🧹 Loại bỏ khoảng trắng và ký tự không mong muốn

python
# Dữ liệu từ form nhập liệu (thường có khoảng trắng thừa)
ho_ten = "   Nguyễn Văn An   "
email = "\t\tuser@example.com\n\n"
so_dien_thoai = "  0901234567  "

print("Trước khi xử lý:")
print(f"Họ tên: '{ho_ten}'")
print(f"Email: '{email}'")
print(f"SĐT: '{so_dien_thoai}'")

# Làm sạch dữ liệu
ho_ten_clean = ho_ten.strip()
email_clean = email.strip()
so_dien_thoai_clean = so_dien_thoai.strip()

print("\nSau khi làm sạch:")
print(f"Họ tên: '{ho_ten_clean}'")
print(f"Email: '{email_clean}'")
print(f"SĐT: '{so_dien_thoai_clean}'")

# Loại bỏ ký tự cụ thể
ma_san_pham = "###SP001***"
ma_clean = ma_san_pham.strip("#*")
print(f"\nMã SP: '{ma_san_pham}' → '{ma_clean}'")

TIP

Luôn sử dụng .strip() khi xử lý input từ người dùng để loại bỏ khoảng trắng thừa

🔤 Cắt chuỗi theo vị trí

python
# Phân tích mã code có cấu trúc
ma_nhan_vien = "DEV2024001"

# Tách thành các phần
bo_phan = ma_nhan_vien[:3]        # 3 ký tự đầu
nam = ma_nhan_vien[3:7]           # 4 ký tự tiếp theo
so_thu_tu = ma_nhan_vien[7:]      # Phần còn lại

print(f"📋 Phân tích mã nhân viên: {ma_nhan_vien}")
print(f"  🏢 Bộ phận: {bo_phan}")
print(f"  📅 Năm: {nam}")
print(f"  🔢 STT: {so_thu_tu}")

# Tạo mã mới
def tao_ma_nhan_vien(bo_phan, nam, stt):
    """Tạo mã nhân viên theo format chuẩn"""
    return f"{bo_phan.upper()}{nam}{stt:03d}"

ma_moi = tao_ma_nhan_vien("hr", "2024", 5)
print(f"\n🆕 Mã mới: {ma_moi}")

🔄 Thay thế và chuyển đổi

🔄 replace() và các biến thể

python
# Xử lý văn bản
bai_van = """
Python là ngôn ngữ lập trình mạnh mẽ. 
Python dễ học và Python có cộng đồng lớn.
Học Python giúp tìm việc dễ dàng.
"""

print("📝 Văn bản gốc:")
print(bai_van)

# Thay thế từ cụ thể
bai_van_sua = bai_van.replace("Python", "JavaScript")
print("🔄 Thay Python → JavaScript:")
print(bai_van_sua)

# Chỉ thay thế n lần đầu tiên
bai_van_sua_gioi_han = bai_van.replace("Python", "Java", 2)
print("🔄 Chỉ thay 2 lần đầu:")
print(bai_van_sua_gioi_han)

# Chuẩn hóa số điện thoại
cac_sdt = [
    "0901-234-567",
    "0901.234.567", 
    "0901 234 567",
    "(090) 123-4567"
]

print("\n📞 Chuẩn hóa số điện thoại:")
for sdt in cac_sdt:
    sdt_chuan = sdt.replace("-", "").replace(".", "").replace(" ", "").replace("(", "").replace(")", "")
    print(f"  {sdt}{sdt_chuan}")

🔀 Chuyển đổi ký tự đặc biệt

python
# Xử lý ký tự có dấu tiếng Việt
text_co_dau = "Tôi học lập trình Python để phát triển ứng dụng"

# Tạo bảng chuyển đổi
bang_chuyen_doi = str.maketrans(
    "àáảãạâầấẩẫậăằắẳẵặèéẻẽẹêềếểễệìíỉĩịòóỏõọôồốổỗộơờớởỡợùúủũụưừứửữự",
    "aaaaaaaaaaaaaaaaaeeeeeeeeeeeiiiiioooooooooooooooouuuuuuuuuuu"
)

text_khong_dau = text_co_dau.translate(bang_chuyen_doi)
print(f"Có dấu: {text_co_dau}")
print(f"Không dấu: {text_khong_dau}")

# Tạo URL slug từ tiêu đề
tieu_de = "Hướng dẫn học Python cho người mới bắt đầu"
url_slug = tieu_de.lower().translate(bang_chuyen_doi).replace(" ", "-")
print(f"URL slug: {url_slug}")

WARNING

Chuyển đổi có dấu sang không dấu có thể làm mất ý nghĩa, hãy cân nhắc khi sử dụng

🔍 Tìm kiếm trong chuỗi

🔍 find() vs index() và các ứng dụng

python
# Phân tích email
email = "user.name+tag@example.com"

# Tìm vị trí các ký tự đặc biệt
vi_tri_at = email.find("@")
vi_tri_dot = email.find(".")
vi_tri_plus = email.find("+")

print(f"📧 Phân tích email: {email}")
print(f"  @ ở vị trí: {vi_tri_at}")
print(f"  . ở vị trí: {vi_tri_dot}")
print(f"  + ở vị trí: {vi_tri_plus if vi_tri_plus != -1 else 'Không có'}")

# Tách email thành các phần
if vi_tri_at != -1:
    username = email[:vi_tri_at]
    domain = email[vi_tri_at + 1:]
    print(f"  👤 Username: {username}")
    print(f"  🌐 Domain: {domain}")

def kiem_tra_email_hop_le(email):
    """Kiểm tra email đơn giản"""
    if email.count("@") != 1:
        return False, "Email phải có đúng 1 ký tự @"
    
    if not email.find("@") > 0:
        return False, "Phần username không được rỗng"
    
    parts = email.split("@")
    if not parts[1] or "." not in parts[1]:
        return False, "Domain không hợp lệ"
    
    return True, "Email hợp lệ"

# Test validation
test_emails = [
    "user@domain.com",
    "@domain.com", 
    "user@",
    "user@@domain.com",
    "user@domain"
]

print("\n✅ Kiểm tra email:")
for email in test_emails:
    hop_le, ly_do = kiem_tra_email_hop_le(email)
    status = "✅" if hop_le else "❌"
    print(f"  {status} {email}: {ly_do}")

📊 Đếm và thống kê

python
# Phân tích văn bản
van_ban = """
Python là ngôn ngữ lập trình dễ học.
Python có syntax đơn giản và rõ ràng.
Cộng đồng Python rất lớn và hỗ trợ tốt.
Python được sử dụng rộng rãi trong AI, web development.
"""

print("📊 PHÂN TÍCH VĂN BẢN")
print("="*40)

# Đếm từ khóa
tu_khoa = "Python"
so_lan_xuat_hien = van_ban.count(tu_khoa)
print(f"🔤 '{tu_khoa}' xuất hiện: {so_lan_xuat_hien} lần")

# Đếm các loại ký tự
so_dong = van_ban.count("\n")
so_cau = van_ban.count(".")
so_tu = len(van_ban.split())

print(f"📏 Số dòng: {so_dong}")
print(f"📝 Số câu: {so_cau}")
print(f"🔤 Số từ: {so_tu}")
print(f"📐 Độ dài: {len(van_ban)} ký tự")

# Phân tích tần suất ký tự
def dem_ky_tu(text):
    """Đếm tần suất xuất hiện của từng ký tự"""
    dem = {}
    for char in text.lower():
        if char.isalpha():  # Chỉ đếm ký tự chữ cái
            dem[char] = dem.get(char, 0) + 1
    
    return sorted(dem.items(), key=lambda x: x[1], reverse=True)

ky_tu_pho_bien = dem_ky_tu(van_ban)
print(f"\n🔥 Top 5 ký tự phổ biến:")
for char, count in ky_tu_pho_bien[:5]:
    print(f"  '{char}': {count} lần")

📐 Định dạng và căn chỉnh

📏 Căn chỉnh văn bản

python
# Tạo bảng thông tin đẹp
thong_tin_sp = [
    ("iPhone 15", "25,000,000", "50"),
    ("Samsung S24", "22,000,000", "30"), 
    ("MacBook Air", "35,000,000", "20"),
    ("Dell XPS", "28,000,000", "15")
]

print("🛍️ DANH SÁCH SẢN PHẨM")
print("="*60)

# Header với căn chỉnh
header_san_pham = "Sản phẩm".ljust(15)
header_gia = "Giá".rjust(12)
header_kho = "Kho".rjust(5)
print(f"{header_san_pham} | {header_gia} | {header_kho}")
print("-" * 60)

# Dữ liệu với căn chỉnh
for ten, gia, kho in thong_tin_sp:
    ten_formatted = ten.ljust(15)
    gia_formatted = gia.rjust(12)
    kho_formatted = kho.rjust(5)
    print(f"{ten_formatted} | {gia_formatted} | {kho_formatted}")

# Căn giữa tiêu đề
tieu_de = "THỐNG KÊ BÁN HÀNG THÁNG 12"
tieu_de_centered = tieu_de.center(50, "=")
print(f"\n{tieu_de_centered}")

🔢 Định dạng số và text

python
# Định dạng số với zfill
ma_hoa_don = "123"
ma_formatted = ma_hoa_don.zfill(8)  # Thêm số 0 phía trước
print(f"📋 Mã hóa đơn: {ma_hoa_don}{ma_formatted}")

# Tạo ID có format chuẩn
def tao_id_khach_hang(stt, prefix="KH"):
    """Tạo ID khách hàng với format: KH00001"""
    return f"{prefix}{str(stt).zfill(5)}"

for i in [1, 25, 999, 10000]:
    id_kh = tao_id_khach_hang(i)
    print(f"  STT {i}{id_kh}")

# F-string nâng cao
ten = "Nguyễn Văn An"
tuoi = 25
luong = 15000000
ti_le_thuong = 0.158

print(f"\n👤 THÔNG TIN NHÂN VIÊN")
print(f"📛 Tên: {ten}")
print(f"🎂 Tuổi: {tuoi}")
print(f"💰 Lương: {luong:,} VND")  # Thêm dấu phẩy ngăn cách
print(f"🎁 Tỷ lệ thưởng: {ti_le_thuong:.1%}")  # Format phần trăm
print(f"💵 Thưởng: {luong * ti_le_thuong:,.0f} VND")

TIP

F-string có thể format số, ngày tháng, căn chỉnh rất mạnh mẽ

💫 F-string advanced formatting

python
import datetime

# Dữ liệu mẫu
san_pham = "Laptop Dell XPS"
gia = 28500000
so_luong = 3
ngay_mua = datetime.date(2024, 12, 15)
giam_gia = 0.15

print("🧾 HÓA ĐƠN MUA HÀNG")
print("="*50)

# Các kiểu format khác nhau
print(f"📦 Sản phẩm: {san_pham}")
print(f"💰 Đơn giá: {gia:>15,} VND")  # Căn phải, có dấu phẩy
print(f"🔢 Số lượng: {so_luong:>15}")
print(f"📅 Ngày mua: {ngay_mua:%d/%m/%Y}")  # Format ngày
print(f"🏷️ Giảm giá: {giam_gia:>14.0%}")  # Format phần trăm

# Tính toán trong f-string
thanh_tien = gia * so_luong
tien_giam = thanh_tien * giam_gia
tong_tien = thanh_tien - tien_giam

print("-" * 50)
print(f"💵 Thành tiền: {thanh_tien:>13,} VND")
print(f"💸 Tiền giảm: {tien_giam:>13,.0f} VND")
print(f"💳 Tổng tiền: {tong_tien:>13,.0f} VND")

# Debug với f-string (Python 3.8+)
x = 10
y = 20
print(f"\n🔍 Debug: {x=}, {y=}, {x+y=}")

📝 Bài tập thực hành

Bài tập 1: Xử lý dữ liệu CSV

Cho chuỗi CSV: "John,25,Engineer,5000|Jane,30,Manager,7000|Bob,28,Developer,6000"

  • Tách thành danh sách nhân viên
  • Tính lương trung bình
  • Tìm người có lương cao nhất
python
# Đáp án
data = "John,25,Engineer,5000|Jane,30,Manager,7000|Bob,28,Developer,6000"
nhan_vien_list = data.split("|")

tong_luong = 0
max_luong = 0
ten_max = ""

for nv in nhan_vien_list:
    ten, tuoi, job, luong = nv.split(",")
    luong_num = int(luong)
    tong_luong += luong_num
    
    if luong_num > max_luong:
        max_luong = luong_num
        ten_max = ten

luong_tb = tong_luong / len(nhan_vien_list)
print(f"Lương TB: ${luong_tb:.0f}")
print(f"Lương cao nhất: {ten_max} - ${max_luong}")

📚 Tóm tắt

Cắt ghép:

  • .split(), .join(): Tách và ghép chuỗi
  • .strip(): Loại bỏ khoảng trắng
  • Slicing [start:end]: Cắt theo vị trí

Thay thế:

  • .replace(): Thay thế text
  • .translate(): Chuyển đổi ký tự theo bảng

Tìm kiếm:

  • .find(), .index(): Tìm vị trí
  • .count(): Đếm số lần xuất hiện
  • .startswith(), .endswith(): Kiểm tra đầu/cuối

Định dạng:

  • .center(), .ljust(), .rjust(): Căn chỉnh
  • .zfill(): Thêm số 0 phía trước
  • F-string: Định dạng linh hoạt và mạnh mẽ

Lời khuyên

Kết hợp nhiều phương thức để xử lý văn bản phức tạp một cách hiệu quả

🐍 Khóa học Python căn bản bằng tiếng Việt