Điều khiển chuỗi trong Python: Chỉ số, cắt mảng, tìm kiếm, biến đổi và kiểm tra tính chất

1. Khái niệm chuỗi

Chuỗi (str) là kiểu dữ liệu cơ bản và phổ biến nhất trong Python, được tạo bằng cách bao quanh ký tự hoặc dãy ký tự bởi dấu nháy đơn ('...'), nháy kép ("...") hoặc ba dấu nháy ('''...''' hoặc """...""").

text_a = 'Xin chào thế giới'
text_b = "Python lập trình"
print(type(text_a))  # <class 'str'>
print(type(text_b))  # <class 'str'>

1.1 Các dạng khai báo chuỗi

  • Nháy đơn/nháy kép: dùng cho chuỗi một dòng.
ten_1 = 'An'
ten_2 = "Bình"
  • Ba dấu nháy: hỗ trợ đa dòng và giữ nguyên định dạng xuống dòng.
gioi_thieu_1 = '''Tôi tên là An,
sống tại Hà Nội.'''
gioi_thieu_2 = """Tôi tên là Bình,
làm việc tại TP.HCM."""
print(gioi_thieu_1)
# Tôi tên là An,
# sống tại Hà Nội.

Khi cần chứa ký tự đặc biệt như dấu nháy trong chuỗi, có thể dùng ký tự thoát (\') hoặc đổi loại nháy:

cau = "An nói: 'Xin chào!'"
cau_khac = 'An nói: \'Xin chào!\''

1.2 Định dạng đầu ra chuỗi

Có nhiều cách để chèn giá trị vào chuỗi:

ho_ten = "Lan"
print("Tên tôi là", ho_ten)                      # Cách cơ bản
print("Tên tôi là %s" % ho_ten)                  # Dạng % formatting
print("Tên tôi là {}".format(ho_ten))           # Dạng .format()
print(f"Tên tôi là {ho_ten}")                    # f-string (ưu tiên)

1.3 Nhập liệu từ người dùng

Hàm input() luôn trả về chuỗi — kể cả khi người dùng nhập số:

ten = input("Nhập tên bạn: ")
mat_khau = input("Nhập mật khẩu: ")
print(f"Tên: '{ten}' (kiểu {type(ten)})")
print(f"Mật khẩu: '{mat_khau}' (kiểu {type(mat_khau)})")

2. Truy cập ký tự qua chỉ số (index)

Mỗi ký tự trong chuỗi có một vị trí xác định bắt đầu từ 0. Chỉ số âm đếm ngược từ cuối (-1 là ký tự cuối cùng).

chuoi = "Python"
print(chuoi[0])   # 'P'
print(chuoi[2])   # 't'
print(chuoi[-1])  # 'n'
print(chuoi[-3])  # 'h'

3. Cắt chuỗi (slicing)

Cú pháp: [start:end:step], trong đó:

  • start: chỉ số bắt đầu (mặc định = 0)
  • end: chỉ số kết thúc (không bao gồm phần tử tại end; mặc định = độ dài chuỗi)
  • step: bước nhảy (mặc định = 1; âm → đảo ngược thứ tự)
data = "programming"
print(data[2:7])     # "ogram"
print(data[:5])      # "progr"
print(data[5:])      # "amming"
print(data[::2])     # "prormn"
print(data[::-1])    # "gnimmargorp"
print(data[-6:-2])   # "ammi"

Ví dụ chia chuỗi thành các đoạn cố định:

du_lieu = "ABCDEFGHIJKL"
do_dai_doan = 4
ket_qua = [du_lieu[i:i + do_dai_doan] for i in range(0, len(du_lieu), do_dai_doan)]
print(ket_qua)  # ['ABCD', 'EFGH', 'IJKL']

4. Các phương thức xử lý chuỗi

4.1 Tìm kiếm vị trí và tần suất xuất hiện

  • find(sub[, start[, end]]): trả về chỉ số đầu tiên của sub, hoặc -1 nếu không tìm thấy.
  • rfind(...): tìm từ phải sang trái.
  • index(...)rindex(...): tương tự nhưng ném ngoại lệ ValueError nếu không tìm thấy.
  • count(sub[, start[, end]]): đếm số lần xuất hiện.
s = "apple banana apple cherry apple"
print(s.find("apple"))        # 0
print(s.rfind("apple"))       # 27
print(s.count("apple"))       # 3
print(s.count("apple", 5))    # 2 (bắt đầu từ vị trí 5)

4.2 Biến đổi chuỗi

Chuỗi trong Python là bất biến — mọi thao tác đều tạo chuỗi mới.

  • replace(old, new[, count]): thay thế tất cả hoặc tối đa count lần.
  • split(sep=None, maxsplit=-1): phân tách thành danh sách theo sep.
  • rsplit(...): phân tách từ phải sang trái.
  • join(iterable): nối các phần tử trong iterable bằng chuỗi gọi hàm.
  • upper(), lower(), title(), capitalize(), swapcase()
  • strip([chars]), lstrip([chars]), rstrip([chars]): loại bỏ ký tự ở hai đầu hoặc một bên.
  • ljust(width[, fillchar]), rjust(...), center(...): căn lề với ký tự điền.
s = "  Hello World!  "
print(s.strip())               # "Hello World!"
print(s.upper())               # "  HELLO WORLD!  "
print("-".join(["A", "B", "C"])) # "A-B-C"
print("code".center(10, "*"))   # "***code***"

4.3 Kiểm tra tính chất chuỗi

Các phương thức trả về True hoặc False:

  • startswith(prefix[, start[, end]]), endswith(...)
  • isalpha(), isdigit(), isalnum(), isspace()
  • isupper(), islower()
  • Toán tử in: kiểm tra sự tồn tại của chuỗi con.
s = "Python3.10"
print(s.startswith("Py"))      # True
print(s.isalnum())             # True
print(s.isdigit())             # False
print("thon" in s)             # True

5. Xử lý chuỗi động (mutable string)

Vì chuỗi không thể thay đổi trực tiếp, để mô phỏng "chuỗi có thể sửa", ta dùng io.StringIO:

import io

chuoi_goc = "Hello World"
buffer = io.StringIO(chuoi_goc)

# Di chuyển con trỏ và ghi đè
buffer.seek(6)                # tới vị trí ký tự thứ 7 ('W')
buffer.write("Python!")       # ghi đè từ đây

ket_qua = buffer.getvalue()
print(ket_qua)  # "Hello Python!"
buffer.close()

Lưu ý: Đây không phải là thay đổi chuỗi gốc mà là thao tác trên vùng đệm bộ nhớ — phù hợp cho các tác vụ xây dựng chuỗi phức tạp hiệu quả hơn việc nối chuỗi liên tục.

Thẻ: python string slicing io-stringio

Đăng vào ngày 5 tháng 7 lúc 03:24