Menu

Chuỗi trong Python: f-string, cắt chuỗi và các phương thức

Làm việc với văn bản trong Python: tạo chuỗi, dùng f-string, cắt chuỗi và các phương thức thường dùng như split, join, replace và strip.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Văn bản, nhưng có phương thức

Chuỗi (string) trong Python là một dãy ký tự, và bạn sẽ dùng chuỗi nhiều hơn bất kỳ kiểu dữ liệu nào khác. Mọi cái tên, nhãn, thông báo, URL, đường dẫn tệp và response từ API đều nằm trong một chuỗi vào lúc nào đó.

Tạo chuỗi bằng dấu nháy: nháy đơn, nháy kép hoặc ba dấu nháy:

Nháy đơn và nháy kép dùng thay cho nhau được. Hãy dùng loại nào giúp bạn không phải escape ký tự. "don't" thì gọn gàng; 'don\'t' cần thêm dấu gạch chéo ngược.

Chuỗi là bất biến. Khi một chuỗi đã tồn tại, bạn không thể sửa một ký tự của nó tại chỗ. Mọi thao tác trông như đang thay đổi chuỗi thực ra đều trả về một chuỗi mới. Đó là lý do bạn sẽ viết text = text.upper() chứ không chỉ text.upper(): nếu không gán lại, chuỗi viết hoa mới sẽ bị bỏ đi.

Nối và lặp chuỗi

Hai toán tử lo phần lớn việc ghép chuỗi bạn cần:

+ nối các chuỗi. * lặp lại một chuỗi. Cả hai đều trả về một chuỗi mới.

Nối nhiều mảnh bằng + sẽ nhanh chóng trở nên rối. Khi cần trộn các giá trị thuộc nhiều kiểu khác nhau vào một thông báo, hãy dùng f-string: xem phần tiếp theo.

f-string: cách định dạng bạn sẽ dùng thường xuyên

Đặt chữ f trước dấu nháy mở và chuỗi trở thành một khuôn mẫu. Mọi thứ trong {...} được thay bằng giá trị của biểu thức đó:

Bạn có thể đặt bất kỳ biểu thức nào trong cặp ngoặc nhọn: biến, phép tính, lời gọi phương thức, lời gọi hàm. Tuy vậy, hãy giữ chúng đơn giản; nếu bạn muốn nhồi một phép tính ba dòng vào {...}, hãy tính nó vào một biến có tên trước.

f-string còn hỗ trợ đặc tả định dạng sau dấu hai chấm, để kiểm soát cách hiển thị số, phần đệm và căn lề:

Các đặc tả định dạng này giống với những gì str.format() dùng, và đáng để lướt qua khi bạn đã vững phần cơ bản. Bạn chưa cần chúng cho code ngày đầu.

Cắt chuỗi: lấy một phần

Chuỗi có thể truy cập theo chỉ số như các dãy khác. Mỗi ký tự có một vị trí bắt đầu từ 0, và bạn có thể lấy một ký tự hoặc cả một đoạn:

Mẫu [start:stop:step] cũng xuất hiện ở list và các dãy khác, nên dành vài phút để thấm nó sẽ có lợi ở mọi nơi.

Hai điều đáng lưu ý:

  • Chỉ số stop không được tính: word[0:2] gồm chỉ số 0 và 1, không gồm 2.
  • Chỉ số âm đếm từ cuối: -1 là ký tự cuối cùng, -2 là ký tự ngay trước nó, cứ thế tiếp tục.

Cách đảo ngược một chuỗi

Chuỗi không có phương thức .reverse() vì chúng bất biến, nhưng cắt chuỗi với bước -1 làm được việc đó trong một dòng:

word[::-1] được đọc là "từ đầu đến cuối, lùi lại từng bước 1". Kết quả là một chuỗi hoàn toàn mới; chuỗi gốc không bị động đến. Nếu bạn cần duyệt các ký tự theo chiều ngược mà không tạo chuỗi mới, reversed(word) trả về một iterator lười.

Cách kiểm tra độ dài chuỗi

len(text) trả về số ký tự:

Lưu ý len đếm code point Unicode, không đếm byte. len("café") là 4, không phải 5, dù khi mã hóa UTF-8 thì tốn nhiều byte hơn; thường thì đó chính là điều bạn muốn.

Cách kiểm tra chuỗi có chứa chuỗi con hay không

Toán tử in là cách kiểm tra chuẩn mực, và đọc lên gần như câu tiếng Anh:

Để kiểm tra không phân biệt hoa thường, hãy chuẩn hóa cả hai vế trước:

Nếu bạn cần vị trí chứ không chỉ câu trả lời có hay không, hãy dùng .find(): nó trả về chỉ số, hoặc -1 khi không có chuỗi con đó.

Các phương thức chuỗi thường dùng

Chuỗi có hàng chục phương thức. Bạn sẽ dùng nhóm nhỏ này liên tục:

Tách và nối:

.split(separator) biến một chuỗi thành list. separator.join(list_of_strings) ghép chúng lại. Hai phương thức này gánh một phần rất lớn công việc xử lý chuỗi trong thực tế.

Thêm một cặp hữu ích nữa:

Đó là một trình phân tích cho một dòng cấu hình, viết trong ba dòng. Chuỗi nhỏ, hiệu quả lớn.

Kiểm tra nội dung bên trong

Một số phương thức trả về boolean, rất tiện trong điều kiện if:

Hãy dùng chúng có chừng mực: chúng không xử lý mọi điểm đặc biệt của Unicode theo cách bạn có thể mong đợi. Với bất cứ thứ gì ngoài ASCII, hãy dựa vào module regex hoặc module unicodedata.

Escape ký tự đặc biệt

Một số ký tự cần dấu gạch chéo ngược để xuất hiện trong chuỗi:

Nếu bạn viết đường dẫn Windows hoặc regex, chuỗi thô (raw string) sẽ giúp mọi việc dễ hơn. Đặt chữ r trước dấu nháy và dấu gạch chéo ngược không còn là ký tự escape nữa:

Chuỗi có ở khắp nơi, nên hãy giữ code dễ đọc

Ba thói quen giúp code xử lý nhiều chuỗi không biến thành một mớ hỗn độn:

  1. Dùng f-string để chèn giá trị. Đừng nối + liên tiếp qua nhiều kiểu dữ liệu.
  2. Gán lại khi "thay đổi". Viết text = text.strip(), không chỉ text.strip().
  3. Dùng .split() và .join() trước khi tự viết vòng lặp để phân tích hay ghép văn bản. Chúng nhanh hơn, rõ ràng hơn và khó sai hơn.

Tiếp theo: tìm hiểu sâu về f-string, công cụ định dạng bạn đã gặp vài lần, cùng các đặc tả định dạng số và ngày tháng khiến chúng đáng để thành thạo.

Câu hỏi thường gặp

f-string trong Python là gì?

f-string là một chuỗi có tiền tố f, trong đó mọi thứ nằm trong {...} được thay bằng giá trị của biểu thức đó. Ví dụ: f"Hello, {name}!" chèn giá trị hiện tại của name vào chuỗi lúc chạy.

Làm sao đảo ngược một chuỗi trong Python?

Dùng cắt chuỗi với bước -1: reversed_text = original[::-1]. Cách này trả về một chuỗi mới gồm cùng các ký tự theo thứ tự ngược lại. Chuỗi gốc không bị thay đổi vì chuỗi trong Python là bất biến.

Làm sao tách một chuỗi trong Python?

Gọi .split() trên chuỗi. Không truyền đối số thì nó tách theo mọi khoảng trắng: "a b c".split() trả về ['a', 'b', 'c']. Bạn có thể truyền một ký tự phân cách cụ thể: "a,b,c".split(",") trả về ['a', 'b', 'c'].

Chuỗi trong Python có thay đổi được không?

Không. Chuỗi là bất biến: khi một chuỗi đã tồn tại, bạn không thể sửa bất kỳ ký tự nào của nó tại chỗ. Mọi phương thức "thay đổi" chuỗi thực ra đều trả về một chuỗi mới. Đó là lý do bạn thấy những mẫu như text = text.strip(): bạn gán lại biến cho chuỗi mới.

Làm sao nối chuỗi trong Python?

Dùng + để nối hai chuỗi: "hello" + " " + "world". Để chèn một giá trị vào câu, hãy ưu tiên f-string: f"Hello, {name}". Để nối nhiều mảnh từ một list, dùng separator.join(pieces): cách này nhanh hơn và dễ đọc hơn so với nối nhiều dấu +.

Làm sao kiểm tra độ dài chuỗi trong Python?

Gọi hàm có sẵn len(text). Hàm này trả về số ký tự (số code point Unicode), nên len("café") là 4. Muốn biết độ dài theo byte, hãy mã hóa trước: len(text.encode("utf-8")).

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu