Thao tác chuỗi với string methods trong Python

Python Tutorial | by Hoc Python

Bạn có thể đã biết rằng chuỗi trong Python là bất biến (immutable) – nghĩa là bạn không thể thay đổi chúng trực tiếp sau khi chúng đã được tạo. Tuy nhiên, điều đó không có nghĩa là bạn không thể "thao tác" với chúng. Thay vào đó, Python cung cấp một bộ công cụ mạnh mẽ được gọi là phương thức chuỗi (string methods).Hãy hình dung các string methods như những "nút bấm" hoặc "chức năng" được tích hợp sẵn mà bạn có thể yêu cầu chuỗi thực hiện. Chúng giúp bạn thực hiện mọi thứ từ việc chuyển đổi chữ hoa/thường, tìm kiếm và thay thế văn bản, đến việc chia nhỏ chuỗi thành các phần hoặc kiểm tra nội dung của chúng một cách dễ dàng và hiệu quả.

Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách sử dụng các string methods này, từ cú pháp cơ bản đến các nhóm phương thức phổ biến và ứng dụng thực tế của chúng. Hãy sẵn sàng để làm chủ việc thao tác chuỗi trong Python nhé!

Cách dùng String Methods cơ bản trong Python

Bạn đã biết rằng chuỗi (strings) trong Python là bất biến, nghĩa là bạn không thể thay đổi chúng trực tiếp sau khi tạo. Tuy nhiên, điều này không có nghĩa là bạn không thể thực hiện các thao tác trên chúng! Thay vào đó, Python cung cấp một bộ sưu tập các phương thức chuỗi (string methods).

String Methods là gì?

String Methods (phương thức chuỗi) là các "hành động" hoặc "chức năng" được xây dựng sẵn mà bạn có thể yêu cầu một đối tượng chuỗi thực hiện. Hãy hình dung chuỗi như một "công cụ" đặc biệt dành cho văn bản, và mỗi phương thức là một "nút bấm" hoặc một "lưỡi dao" được thiết kế sẵn trên công cụ đó để thực hiện một tác vụ cụ thể.

Khi bạn gọi một phương thức trên một chuỗi, nó sẽ thực hiện một thao tác nào đó (ví dụ: chuyển đổi chữ hoa, thay thế văn bản, tìm kiếm, v.v.) và thường trả về một chuỗi MỚI đã được biến đổi, hoặc trả về một thông tin nào đó về chuỗi đó (ví dụ: vị trí của một ký tự, số lần xuất hiện của một từ). Chuỗi gốc sẽ không bị thay đổi.

Cú pháp cơ bản:

Để gọi một phương thức chuỗi, bạn sử dụng cú pháp dấu chấm (.) sau tên biến chứa chuỗi (hoặc trực tiếp sau một chuỗi được đặt trong dấu nháy):

ten_bien_chuoi.ten_phuong_thuc(doi_so_neu_co)

  • ten_bien_chuoi: Là tên của biến mà bạn đã gán một chuỗi vào (ví dụ: thong_bao, ten_san_pham).

  • . (dấu chấm): Dùng để "truy cập" vào các phương thức có sẵn của đối tượng chuỗi.

  • ten_phuong_thuc: Tên của hành động bạn muốn thực hiện (ví dụ: upper, replace, split).

  • () (dấu ngoặc đơn): Luôn phải có sau tên phương thức, ngay cả khi phương thức đó không cần bất kỳ thông tin bổ sung nào (đối số) để hoạt động.

  • doi_so_neu_co: Một số phương thức cần thêm thông tin để thực hiện công việc của chúng (ví dụ: phương thức replace() cần biết bạn muốn thay thế cái gì và bằng cái gì). Các thông tin này được đặt bên trong dấu ngoặc đơn.

Ví dụ cơ bản để minh họa cách dùng:

Hãy xem xét một vài ví dụ đơn giản để bạn dễ hình dung:

Ví dụ 1: Chuyển chuỗi thành chữ HOA với .upper() Phương thức upper() không cần đối số và sẽ trả về một bản sao của chuỗi gốc với tất cả các chữ cái được chuyển thành chữ hoa.

thong_bao = "hello world" # Đây là chuỗi gốc
print(f"Chuỗi gốc: '{thong_bao}'")

# Gọi phương thức .upper() trên chuỗi 'thong_bao'
chuoi_hoa = thong_bao.upper() # Kết quả được gán vào biến 'chuoi_hoa'

print(f"Chuỗi sau khi gọi .upper(): '{chuoi_hoa}'")
print(f"Chuỗi gốc (không đổi): '{thong_bao}'") # Chuỗi gốc vẫn y nguyên
# Kết quả:
# Chuỗi gốc: 'hello world'
# Chuỗi sau khi gọi .upper(): 'HELLO WORLD'
# Chuỗi gốc (không đổi): 'hello world'

Ví dụ 2: Thay thế một phần chuỗi với .replace() Phương thức replace() cần hai đối số: chuỗi con muốn thay thế và chuỗi con mới.

cau_goc = "Tôi thích màu xanh."
print(f"Chuỗi gốc: '{cau_goc}'")

# Gọi phương thức .replace() để thay thế "xanh" bằng "đỏ"
cau_moi = cau_goc.replace("xanh", "đỏ") # Kết quả được gán vào 'cau_moi'

print(f"Chuỗi sau khi thay thế: '{cau_moi}'")
print(f"Chuỗi gốc (không đổi): '{cau_goc}'") # Chuỗi gốc vẫn y nguyên
# Kết quả:
# Chuỗi gốc: 'Tôi thích màu xanh.'
# Chuỗi sau khi thay thế: 'Tôi thích màu đỏ.'
# Chuỗi gốc (không đổi): 'Tôi thích màu xanh.'

Việc nắm vững cú pháp cơ bản này là bước đầu tiên để bạn có thể tận dụng vô số các string methods mà Python cung cấp, giúp bạn xử lý văn bản một cách hiệu quả và chuyên nghiệp.

Các nhóm String Methods phổ biến và ứng dụng trong Python

Python cung cấp rất nhiều phương thức chuỗi, nhưng chúng ta có thể nhóm chúng lại thành các loại chính dựa trên chức năng.

Thay đổi/Chuyển đổi Case (chữ hoa/chữ thường)

  • Mục đích: Các phương thức này giúp bạn thay đổi kiểu chữ (case) của các ký tự trong chuỗi, điều này rất quan trọng để chuẩn hóa dữ liệu hoặc định dạng hiển thị.

Các phương thức:

  • .upper(): Chuyển tất cả các chữ cái trong chuỗi thành chữ hoa. Các ký tự không phải chữ cái (số, ký hiệu) sẽ không thay đổi.

ten = "mai anh"
thong_bao = "welcome to python 101!"
print(f"'{ten}'.upper() -> '{ten.upper()}'")         # Kết quả: 'mai anh'.upper() -> 'MAI ANH'
print(f"'{thong_bao}'.upper() -> '{thong_bao.upper()}'") # Kết quả: 'welcome to python 101!'.upper() -> 'WELCOME TO PYTHON 101!'

.lower(): Chuyển tất cả các chữ cái trong chuỗi thành chữ thường.

ten = "NGUYEN VAN B"
tieu_de = "PYTHON PROGRAMMING"
print(f"'{ten}'.lower() -> '{ten.lower()}'")         # Kết quả: 'NGUYEN VAN B'.lower() -> 'nguyen van b'
print(f"'{tieu_de}'.lower() -> '{tieu_de.lower()}'") # Kết quả: 'PYTHON PROGRAMMING'.lower() -> 'python programming'

.title(): Viết hoa chữ cái đầu tiên của MỖI từ trong chuỗi. Các chữ cái còn lại trong mỗi từ sẽ chuyển thành chữ thường.

tieu_de = "the great python journey"
dia_chi = "123 pho quang trung, ha noi"
print(f"'{tieu_de}'.title() -> '{tieu_de.title()}'") # Kết quả: 'the great python journey'.title() -> 'The Great Python Journey'
print(f"'{dia_chi}'.title() -> '{dia_chi.title()}'") # Kết quả: '123 pho quang trung, ha noi'.title() -> '123 Pho Quang Trung, Ha Noi'

.capitalize(): Chỉ viết hoa chữ cái đầu tiên của CẢ chuỗi (tức là chữ cái đầu tiên của từ đầu tiên). Tất cả các chữ cái còn lại trong chuỗi sẽ được chuyển thành chữ thường.

cau = "chào Mừng bạn đến với python."
ten_rieng = "nguyen VAN a"
print(f"'{cau}'.capitalize() -> '{cau.capitalize()}'")       # Kết quả: 'chào Mừng bạn đến với python.'.capitalize() -> 'Chào mừng bạn đến với python.'
print(f"'{ten_rieng}'.capitalize() -> '{ten_rieng.capitalize()}'") # Kết quả: 'nguyen VAN a'.capitalize() -> 'Nguyen van a'

Ứng dụng:

  • Chuẩn hóa dữ liệu: Rất hữu ích khi bạn nhận dữ liệu nhập từ người dùng mà không biết họ gõ chữ hoa hay chữ thường (ví dụ: input_ten.lower() == "admin" để so sánh không phân biệt chữ hoa/thường).

  • Định dạng hiển thị: Chuyển tiêu đề, tên riêng sang định dạng chuẩn trước khi hiển thị.

Thao tác và Tìm kiếm/Thay thế

Mục đích: Các phương thức này giúp bạn xử lý, tìm kiếm chuỗi con hoặc thay thế các phần trong chuỗi.

Các phương thức:

.strip(): Xóa các khoảng trắng thừa (dấu cách, tab, xuống dòng) ở đầu và cuối chuỗi. Bạn cũng có thể truyền một chuỗi các ký tự cụ thể để xóa chúng ở đầu và cuối.

Có hai phương thức liên quan:

  • lstrip(): Chỉ xóa khoảng trắng/ký tự ở đầu (bên trái) chuỗi.

  • rstrip(): Chỉ xóa khoảng trắng/ký tự ở cuối (bên phải) chuỗi.

data_raw = "  Python is fun!   \n"
du_lieu_tu_file = "---ITEM_CODE---"
print(f"'{data_raw}'.strip() -> '{data_raw.strip()}'")           # Kết quả: '  Python is fun!   \n'.strip() -> 'Python is fun!'
print(f"'{data_raw}'.lstrip() -> '{data_raw.lstrip()}'")         # Kết quả: '  Python is fun!   \n'.lstrip() -> 'Python is fun!   \n'
print(f"'{du_lieu_tu_file}'.strip('-') -> '{du_lieu_tu_file.strip('-')}'") # Kết quả: '---ITEM_CODE---'.strip('-') -> 'ITEM_CODE'

.replace(old, new, [count]): Thay thế tất cả các lần xuất hiện của chuỗi con old bằng chuỗi con new. Bạn có thể tùy chọn thêm đối số count để chỉ định số lần thay thế tối đa.

cau = "Tôi thích táo, táo rất ngon. Táo là trái cây yêu thích."
# Thay thế tất cả "táo" bằng "ổi"
print(f"'{cau}'.replace('táo', 'ổi') -> '{cau.replace('táo', 'ổi')}'")
# Kết quả: 'Tôi thích táo, táo rất ngon. Táo là trái cây yêu thích.'.replace('táo', 'ổi') -> 'Tôi thích ổi, ổi rất ngon. Táo là trái cây yêu thích.'

# Thay thế chỉ 1 lần đầu tiên
print(f"'{cau}'.replace('táo', 'ổi', 1) -> '{cau.replace('táo', 'ổi', 1)}'")
# Kết quả: 'Tôi thích táo, táo rất ngon. Táo là trái cây yêu thích.'.replace('táo', 'ổi', 1) -> 'Tôi thích ổi, táo rất ngon. Táo là trái cây yêu thích.'

.find(sub, [start], [end]): Tìm vị trí chỉ mục (index) đầu tiên mà chuỗi con sub xuất hiện trong chuỗi. Chỉ mục bắt đầu từ 0. Nếu không tìm thấy, nó trả về -1.

text = "Hello World, Hello Python"
print(f"'{text}'.find('World') -> {text.find('World')}")     # Kết quả: 'Hello World, Hello Python'.find('World') -> 6
print(f"'{text}'.find('Hello', 7) -> {text.find('Hello', 7)}") # Tìm 'Hello' từ chỉ mục 7 -> Kết quả: 'Hello World, Hello Python'.find('Hello', 7) -> 13
print(f"'{text}'.find('Java') -> {text.find('Java')}")       # Kết quả: 'Hello World, Hello Python'.find('Java') -> -1

.count(sub, [start], [end]): Đếm số lần chuỗi con sub xuất hiện trong chuỗi.

text = "banana"
cau = "Python is great. Python is powerful."
print(f"'{text}'.count('a') -> {text.count('a')}")     # Kết quả: 'banana'.count('a') -> 3
print(f"'{cau}'.count('Python') -> {cau.count('Python')}") # Kết quả: 'Python is great. Python is powerful.'.count('Python') -> 2

Ứng dụng:

  • Làm sạch dữ liệu: Loại bỏ khoảng trắng thừa từ dữ liệu nhập liệu hoặc đọc từ file.

  • Sửa lỗi chính tả: Tự động sửa các lỗi phổ biến.

  • Trích xuất thông tin: Tìm vị trí của các từ khóa hoặc đếm số lần xuất hiện của một yếu tố nào đó.

Chia và Nối chuỗi Mục đích: Các phương thức này giúp bạn tách một chuỗi lớn thành các phần nhỏ hơn (dưới dạng danh sách) hoặc nối các chuỗi nhỏ từ danh sách thành một chuỗi lớn.

Các phương thức:

.split(delimiter): Tách chuỗi thành một danh sách (list) các chuỗi con dựa trên một ký tự hoặc chuỗi phân tách (delimiter).

  • Nếu delimiter không được cung cấp, split() sẽ tách chuỗi theo khoảng trắng (bao gồm cả tab và xuống dòng) và xử lý nhiều khoảng trắng liên tiếp như một.

  • split() thường được dùng để phân tích cú pháp các dòng dữ liệu.

cau = "Học Python thật là vui."
tu_don = cau.split() # Tách theo khoảng trắng (mặc định)
print(f"'{cau}'.split() -> {tu_don}") # Kết quả: 'Học Python thật là vui.'.split() -> ['Học', 'Python', 'thật', 'là', 'vui.']

ngay_thang = "2023-10-26"
parts = ngay_thang.split("-") # Tách theo dấu gạch ngang
print(f"'{ngay_thang}'.split('-') -> {parts}") # Kết quả: '2023-10-26'.split('-') -> ['2023', '10', '26']

# Tách chuỗi CSV (Comma Separated Values)
csv_line = "Táo,Cam,Ổi,Xoài"
fruits = csv_line.split(",")
print(f"'{csv_line}'.split(',') -> {fruits}") # Kết quả: 'Táo,Cam,Ổi,Xoài'.split(',') -> ['Táo', 'Cam', 'Ổi', 'Xoài']

.join(iterable_of_strings): Nối các chuỗi trong một danh sách (list) (hoặc tuple, set) lại với nhau thành một chuỗi duy nhất. Chuỗi gốc (chuỗi mà bạn gọi .join() trên đó) sẽ trở thành ký tự nối giữa các phần tử.

danh_sach_tu = ['Học', 'Python', 'mỗi', 'ngày']
# Nối các từ bằng khoảng trắng
chuoi_moi = " ".join(danh_sach_tu)
print(f"\" \".join({danh_sach_tu}) -> '{chuoi_moi}'") # Kết quả: " ".join(['Học', 'Python', 'mỗi', 'ngày']) -> 'Học Python mỗi ngày'

duong_phan_cap = ["usr", "local", "bin", "python"]
# Nối các phần tử đường dẫn bằng dấu "/"
duong_dan_hoan_chinh = "/".join(duong_phan_cap)
print(f"\"/\".join({duong_phan_cap}) -> '{duong_dan_hoan_chinh}'") # Kết quả: "/".join(['usr', 'local', 'bin', 'python']) -> 'usr/local/bin/python'

# Nối các số (sau khi chuyển thành chuỗi)
so_thanh_chuoi = ['1', '2', '3', '4', '5']
chuoi_so = "".join(so_thanh_chuoi) # Nối không có ký tự phân cách
print(f"\"\".join({so_thanh_chuoi}) -> '{chuoi_so}'") # Kết quả: "".join(['1', '2', '3', '4', '5']) -> '12345'

Ứng dụng:

  • Phân tích cú pháp dữ liệu: Tách các dòng dữ liệu từ file hoặc input người dùng thành các trường riêng biệt.

  • Xây dựng đường dẫn file/URL: Nối các thành phần lại với nhau một cách chuẩn xác.

  • Tạo câu từ các từ: Ghép các từ rời rạc thành một câu hoàn chỉnh.

Kiểm tra Chuỗi (Kiểm tra kiểu ký tự)

Mục đích: Các phương thức này trả về giá trị Boolean (True hoặc False) để cho biết liệu tất cả các ký tự trong chuỗi (hoặc chuỗi con) có thuộc một loại cụ thể nào đó không (ví dụ: chỉ toàn chữ số, chỉ toàn chữ cái, v.v.). Chúng rất hữu ích cho việc xác thực dữ liệu.

Các phương thức (trả về Boolean):

  • .isalpha(): Trả về True nếu chuỗi chỉ chứa chữ cái (a-z, A-Z) và không rỗng; ngược lại là False.

s_chu = "HelloWorld"
s_so = "123"
s_hon_hop = "Hello World" # Có khoảng trắng
print(f"'{s_chu}'.isalpha() -> {s_chu.isalpha()}")       # True
print(f"'{s_so}'.isalpha() -> {s_so.isalpha()}")         # False
print(f"'{s_hon_hop}'.isalpha() -> {s_hon_hop.isalpha()}") # False

.isdigit(): Trả về True nếu chuỗi chỉ chứa chữ số (0-9) và không rỗng; ngược lại là False.

s_so = "12345"
s_chu = "HelloWorld"
s_thuc = "123.45" # Có dấu chấm
print(f"'{s_so}'.isdigit() -> {s_so.isdigit()}")       # True
print(f"'{s_chu}'.isdigit() -> {s_chu.isdigit()}")     # False
print(f"'{s_thuc}'.isdigit() -> {s_thuc.isdigit()}")   # False

.isalnum(): Trả về True nếu chuỗi chỉ chứa chữ cái HOẶC chữ số (alphanumeric) và không rỗng; ngược lại là False.

s_hon_hop = "Python3"
s_khoang_trang = "Hello World" # Có khoảng trắng
s_ky_tu_dac_biet = "Python!" # Có !
print(f"'{s_hon_hop}'.isalnum() -> {s_hon_hop.isalnum()}")       # True
print(f"'{s_khoang_trang}'.isalnum() -> {s_khoang_trang.isalnum()}") # False
print(f"'{s_ky_tu_dac_biet}'.isalnum() -> {s_ky_tu_dac_biet.isalnum()}") # False

.isspace(): Trả về True nếu chuỗi chỉ chứa khoảng trắng (space, tab, newline) và không rỗng; ngược lại là False.

s_space = "   \t\n"
s_rong = ""
s_khong_space = " Hello "
print(f"'{s_space}'.isspace() -> {s_space.isspace()}")         # True
print(f"'{s_rong}'.isspace() -> {s_rong.isspace()}")           # False (chuỗi rỗng)
print(f"'{s_khong_space}'.isspace() -> {s_khong_space.isspace()}") # False

.startswith(prefix): Kiểm tra xem chuỗi có bắt đầu bằng chuỗi con prefix đã cho hay không. Trả về True hoặc False.

url = "https://www.example.com/page"
print(f"'{url}'.startswith('https://') -> {url.startswith('https://')}") # True
print(f"'{url}'.startswith('https://') -> {url.startswith('https://')}")   # False

.endswith(suffix): Kiểm tra xem chuỗi có kết thúc bằng chuỗi con suffix đã cho hay không. Trả về True hoặc False.

ten_file = "document.docx"
print(f"'{ten_file}'.endswith('.docx') -> {ten_file.endswith('.docx')}") # True
print(f"'{ten_file}'.endswith('.pdf') -> {ten_file.endswith('.pdf')}")   # False

Ứng dụng:

  • Xác thực dữ liệu nhập liệu: Đảm bảo người dùng nhập đúng định dạng (chỉ số, chỉ chữ cái).

  • Phân tích cú pháp file: Kiểm tra định dạng dòng, loại file dựa vào phần mở rộng.

  • Kiểm tra điều kiện: Thực hiện hành động khác nhau tùy thuộc vào nội dung chuỗi.

Việc nắm vững các nhóm phương thức này sẽ trang bị cho bạn bộ công cụ cần thiết để xử lý hầu hết các tác vụ liên quan đến chuỗi trong lập trình Python.

Kết bài

Bạn đã cùng tôi tìm hiểu thế giới của phương thức chuỗi (string methods) trong Python! Chúng là những "công cụ" mạnh mẽ và tiện lợi được tích hợp sẵn, giúp bạn thao tác với chuỗi một cách hiệu quả và gọn gàng.Tính bất biến của chuỗi: Đây là quy tắc vàng! Các string methods không làm thay đổi chuỗi gốc. Thay vào đó, chúng trả về một chuỗi MỚI đã được biến đổi. Hãy nhớ gán kết quả này vào một biến nếu bạn muốn sử dụng nó.

Sức mạnh của các nhóm phương thức:

  • Case Conversion: Dùng .upper(), .lower(), .title(), .capitalize() để chuẩn hóa và định dạng văn bản.

  • Manipulation, Search & Replace: Dùng .strip(), .replace(), .find(), .count() để làm sạch dữ liệu, sửa lỗi hoặc trích xuất thông tin.

  • Splitting & Joining: Dùng .split() để phân tích chuỗi thành các phần và .join() để ghép các phần lại thành một chuỗi duy nhất, rất hữu ích cho việc xử lý dữ liệu có cấu trúc.

  • String Testing: Dùng .isalpha(), .isdigit(), .isalnum(), .isspace(), .startswith(), .endswith() để xác thực và kiểm tra nội dung của chuỗi, đảm bảo dữ liệu đúng định dạng.

Việc thành thạo các string methods không chỉ giúp code của bạn ngắn gọn và dễ đọc hơn mà còn giúp bạn xử lý các tác vụ liên quan đến văn bản một cách chuyên nghiệp và hiệu quả.

Bài viết liên quan