Sitelet https://www.datacamp.com/vi/tutorial/python-string-tutorial
Chuyển đến nội dung chính

Hướng dẫn về Chuỗi trong Python

Trong hướng dẫn này, bạn sẽ học tất tần tật về Chuỗi trong Python: cắt (slicing) và bước nhảy (striding), thao tác và định dạng với lớp Formatter, f-strings, templates và hơn thế nữa!
Đã cập nhật 5 thg 10, 2026  · 10 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

String là một tập hợp các chữ cái, từ hoặc ký tự khác. Đây là một trong những cấu trúc dữ liệu nguyên thủy và là nền tảng cho việc thao tác dữ liệu. Python có một lớp chuỗi tích hợp tên là str. Chuỗi trong Python là "bất biến" nghĩa là không thể thay đổi sau khi được tạo. Khi thao tác với chuỗi, ta tạo chuỗi mới để biểu diễn các giá trị đã tính toán do tính chất bất biến của chúng.

Trong hướng dẫn này, bạn sẽ tìm hiểu sâu về chuỗi và bao quát các chủ đề sau:

string python tutorial

Nếu bạn muốn tìm hiểu thêm về cấu trúc dữ liệu trong Python, hãy xem khóa học hai phần Python Data Science Toolbox của DataCamp. Khóa học này đi sâu hơn vào hàm, iterator, danh sách, v.v.

Strings

Bạn có thể xử lý dữ liệu văn bản trong Python bằng đối tượng str. Chuỗi là các dãy bất biến gồm các ký tự unicode. Unicode là hệ thống được thiết kế để biểu diễn mọi ký tự của các ngôn ngữ. Trong unicode, mỗi chữ cái, ký tự được biểu diễn bằng một số 4 byte. Mỗi số đại diện cho một ký tự duy nhất.

Để biểu diễn một chuỗi, bạn đặt nó trong dấu ngoặc. Có nhiều cách làm điều này:

  • Nháy đơn, như trong ví dụ: 'Nháy đơn cho phép bạn chèn dấu "nháy kép" trong chuỗi.'
  • Nháy kép. Ví dụ: "Nháy kép cho phép bạn chèn dấu 'nháy đơn' trong chuỗi."
  • Ba dấu nháy, như ví dụ này: """Ba dấu nháy dùng nháy kép""", '''Ba dấu nháy dùng nháy đơn.'''

Chuỗi với ba dấu nháy cho phép bạn làm việc với chuỗi nhiều dòng, và toàn bộ khoảng trắng liên quan sẽ được giữ nguyên trong chuỗi.

single_quote = 'Single quote allow you to embed "double" quotes in your string.'
double_quote = "Double quote allow you to embed 'single' quotes in your string."
triple_quote = """Triple quotes allows to embed "double quotes" as well as 'single quotes' in your string. 
And can also span across multiple lines."""

Chuỗi là bất biến, nghĩa là nếu bạn cố thay đổi bất kỳ giá trị nào trong chuỗi, sẽ phát sinh lỗi. Bạn phải tạo một chuỗi mới để đưa thay đổi vào.

triple_quote = '''This is triple quoted string using "single" quotes.'''
triple_quote[35] = "'"
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-207-62d335428dcf> in <module>()
      1 triple_quote = '''This is triple quoted string using "single" quotes.'''
----> 2 triple_quote[35] = "'"


TypeError: 'str' object does not support item assignment
triple_quote_new = triple_quote[0:35] + "'single'" + triple_quote[43:]
print(triple_quote_new)
This is triple quoted string using 'single' quotes.

Bạn có thể tìm độ dài của một chuỗi bằng hàm tích hợp len():

len(triple_quote_new)
51

Bắt đầu học Python miễn phí

Nhập môn Python

BasicSkill Level
4 giờ
7.1M learners
Nắm vững phân tích dữ liệu với Python chỉ trong 4 giờ. Khóa học online này giúp bạn làm quen với giao diện Python và các thư viện phổ biến.
See DetailsRight Arrow
Start Course

Cắt chuỗi (String Slicing) trong Python

Vì chuỗi là một dãy ký tự, bạn có thể truy cập thông qua slicing và indexing giống như với danh sách (list) hoặc bộ (tuple) trong Python. Chuỗi được đánh chỉ số theo từng ký tự và việc đánh số bắt đầu từ 0:

python string tutorial

Trong chuỗi trên, ký tự đầu là C và có chỉ số 0. Ký tự cuối là dấu chấm . là ký tự thứ 16 trong chuỗi. Bạn cũng có thể truy cập các ký tự theo hướng ngược lại bắt đầu từ -1, nghĩa là bạn cũng có thể dùng -1 làm chỉ số để truy cập . trong chuỗi. Có một khoảng trắng giữa Chocolate và cookie, đây cũng là một phần của chuỗi và có chỉ số riêng, trong trường hợp này là 9. Bạn có thể kiểm tra điều này bằng slicing.

Vì mỗi ký tự trong một chuỗi Python có số chỉ mục tương ứng, bạn có thể truy cập và thao tác chuỗi giống như các kiểu dữ liệu tuần tự khác. Slicing là kỹ thuật trong Python cho phép bạn lấy một phần tử cụ thể hoặc một tập con phần tử từ đối tượng chứa dựa trên chỉ số của chúng. Slicing giúp bạn không phải viết vòng lặp để duyệt qua các chỉ số của chuỗi nhằm tìm hoặc lấy các chuỗi con nhất định.

snack = "Chocolate cookie."
print(snack[0])
print(snack[9])
print(snack[-1])
C

.

Giả sử bạn muốn trích xuất chuỗi con 'cookie' từ chuỗi dưới đây. Bạn sẽ làm thế nào?

Trong những trường hợp như vậy, bạn dùng slicing theo khoảng.

Cú pháp cho slicing theo khoảng như sau: [Chỉ số bắt đầu (bao gồm): Chỉ số dừng (loại trừ)]

snack = "Chocolate cookie."
print(snack[10:16])
cookie

Bạn cũng có thể làm điều này bằng giá trị âm cho chỉ số dừng:

print(snack[10:-1]) # -1: vì chỉ số dừng bị loại trừ trong slicing.
cookie

Slicing mà không chỉ định chỉ số dừng có nghĩa là bạn lấy các ký tự từ chỉ số bắt đầu đến tận chỉ số cuối cùng trong câu. Tương tự, slicing thiếu chỉ số bắt đầu nghĩa là bạn bắt đầu từ chỉ số đầu tiên của chuỗi đến chỉ số dừng:

# Không cung cấp giá trị dừng
print(snack[0:]) 

# Không cung cấp giá trị bắt đầu (Giá trị dừng bị loại trừ theo cú pháp)
print(snack[:-1])

# Cách này cũng hợp lệ
print(snack[:])
Chocolate cookie.
Chocolate cookie
Chocolate cookie.

Cắt chuỗi cũng có thể nhận tham số thứ ba là stride, chỉ số bước, tức là bạn muốn tiến bao nhiêu ký tự sau khi lấy ký tự đầu tiên từ chuỗi. Giá trị mặc định của stride là 1.

Hãy xem stride hoạt động để hiểu rõ hơn:

number_string = "1020304050"
print(number_string[0:-1:2])
12345

Mẹo: Một điều rất hay với striding là bạn có thể đảo ngược một chuỗi:

print(number_string[::-1]) #
0504030201

Giá trị -1 cho stride cho phép bạn bắt đầu từ ký tự cuối và lùi lại từng ký tự một.

Hoặc, nếu bạn đặt giá trị -2, bạn bắt đầu từ ký tự cuối và lùi lại mỗi lần hai ký tự:

print(number_string[::-2]) #
00000

Các phép thao tác chuỗi phổ biến

Slicing và slicing theo khoảng là những thao tác phổ biến bạn sẽ cần thực hiện trên chuỗi. Ngoài ra còn có phép nối chuỗi (concatenation), đơn giản như phép cộng:

string1 = 'Chocolate'
string2 = 'cookie'

snack = string1 + " " + string2
print(snack)
Chocolate cookie

Tuy nhiên, điều này sẽ không hoạt động nếu bạn cố nối chuỗi với kiểu dữ liệu khác.

cost = 15
string1 = "The total in Euro is: "

bill = string1 + cost
print(bill)
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-218-7d5c5248b927> in <module>()
      2 string1 = "The total in Euro is: "
      3 
----> 4 bill = string1 + cost
      5 print(bill)


TypeError: Can't convert 'int' object to str implicitly

Ở đây, bạn đã cố nối một chuỗi với một giá trị số nguyên, điều này không được phép. Trình thông dịch không thể ngầm hiểu liệu bạn đang muốn thực hiện phép cộng số nguyên hay nối chuỗi. Tuy nhiên, hãy thử như sau:

bill = string1 + str(cost)
print(bill)
The total in Euro is: 15

Đó là vì bạn đã chuyển đổi rõ ràng số nguyên sang chuỗi rồi mới nối. Để tìm hiểu thêm về chuyển đổi kiểu dữ liệu, hãy xem hướng dẫn này.

Để lặp lại một chuỗi, dùng toán tử *.

single_word = 'hip '
line1 = single_word * 2 + 'hurray! '
print(line1 * 3)
hip hip hurray! hip hip hurray! hip hip hurray! 

Bạn cũng có thể kiểm tra tính thành viên trong chuỗi bằng in và not in:

sub_string1 = 'ice'
sub_string2 = 'glue'
string1 = 'ice cream'
if sub_string in string1:
    print("There is " + sub_string + " in " + string1)
if sub_string2 not in string1:
    print("Phew! No " + sub_string2 + " in " + string1)
There is ice in ice cream
Phew! No glue in ice cream

Python cung cấp nhiều phương thức tích hợp hay hàm trợ giúp để thao tác chuỗi. Thay thế chuỗi con, viết hoa một số từ trong đoạn văn, tìm vị trí của một chuỗi trong chuỗi khác là một số thao tác bạn có thể làm với các phương thức này.

Xem chi tiết một vài phương thức sau:

  • str.capitalize(): trả về bản sao của chuỗi với ký tự đầu được viết hoa.
str.capitalize('cookie')
'Cookie'
  • str.islower(): trả về true nếu mọi ký tự trong chuỗi là chữ thường, ngược lại là false.
snack = 'cookie'
snack.islower()
True
  • str.find(substring): trả về chỉ số thấp nhất trong chuỗi nơi tìm thấy chuỗi con. Bạn cũng có thể chỉ định chỉ số bắt đầu và kết thúc trong chuỗi nơi bạn muốn tìm chuỗi con. Trả về -1 nếu không tìm thấy.
str1 = 'I got you a cookie'
str2 = 'cook'
str1.find(str2)
12
  • str.count(substring): đếm số lần chuỗi con xuất hiện trong chuỗi. Bạn cũng có thể chỉ định chỉ số bắt đầu và kết thúc cho chuỗi.
str1 = 'I got you a cookie, do you like cookies?'
str2 = 'cookie'
str1.count(str2)
2
  • str.isspace(): trả về True nếu trong chuỗi chỉ có các ký tự khoảng trắng, ngược lại là false. Ký tự khoảng trắng gồm khoảng trắng, tab, xuống dòng, v.v.

Điều này hữu ích khi làm việc với dữ liệu thực tế, vốn có thể không luôn mã hóa khoảng trắng đúng cách trong quá trình chuyển đổi định dạng.

str_space = '   '
str_space.isspace()
True
str_tab = '\t'
str_tab.isspace()
True
str_nextline = '''\n'''
str_nextline.isspace()
True

Lưu ý: Bạn có để ý \t, \n ở trên không? Đây được gọi là ký tự thoát (escape characters). Chúng bắt đầu bằng \ (backslash). Bên trong, chúng không được hiểu như chuỗi bình thường mà là các ký tự đặc biệt biểu diễn thứ khác. Ví dụ - \t biểu diễn tab. Còn nhiều ký tự thoát khác và bạn có thể đọc thêm về chúng trong hướng dẫn Python Regex của chúng tôi.

  • str.lstrip(): xóa toàn bộ khoảng trắng ở đầu chuỗi. Đây là một hàm hữu ích khi bạn làm việc với dữ liệu thực tế.
str1 = " I can't hear you. Are you alright? "
str2 = " Yes, all is good."
str3 = str1.lstrip() + str2.lstrip()
print(str3)
I can't hear you. Are you alright? Yes, all is good.
  • str.isdigit(): trả về True nếu chuỗi chỉ chứa chữ số và False nếu không.
number_string = "1020304050"
number_string.isdigit()
True
  • str.replace(substring, new): thay thế mọi lần xuất hiện của chuỗi con trong chuỗi bằng chuỗi mới. Bạn cũng có thể định nghĩa đối số thứ ba max, để thay thế tối đa max lần xuất hiện của chuỗi con. Lưu ý đây không phải là thay thế tại chỗ; tính bất biến vẫn đúng và một chuỗi mới thực sự được tạo ra.
string1 = 'hip hip hurray! hip hip hurray! hip hip hurray!'
string2 = string1.replace('hip', 'Hip')
print(string1)
print(string2)
hip hip hurray! hip hip hurray! hip hip hurray!
Hip Hip hurray! Hip Hip hurray! Hip Hip hurray!
string1.replace('hip', 'Hip', 2)
'Hip Hip hurray! hip hip hurray! hip hip hurray!'
  • str.split(delimiter=""): tách chuỗi theo dấu phân tách (mặc định là khoảng trắng nếu không cung cấp) và trả về danh sách các chuỗi con.
dessert = 'Cake, Cookie, Icecream'
list_dessert = string1.split(',')

Bạn có thể tìm danh sách đầy đủ các phương thức chuỗi trong Python tại đây.

Định dạng chuỗi

Python hỗ trợ nhiều cách để định dạng chuỗi. Trong phần này, bạn sẽ tìm hiểu thêm về việc định dạng chuỗi!

% Định dạng

Toán tử modulo % là một phép toán tích hợp trong Python. Nó được gọi là toán tử nội suy (interpolation operator). Bạn sẽ cần cung cấp % theo sau là kiểu dữ liệu cần định dạng hoặc chuyển đổi. Phép % sau đó thay thế cụm '%datatype' bằng một hoặc nhiều phần tử của kiểu dữ liệu chỉ định:

print("I bought %d Euro worth of %s!" %(200, 'cookies'))
I bought 200 Euro worth of cookies!

Bạn đã thấy %d dùng cho số nguyên và %s cho chuỗi. Một vài kiểu chuyển đổi khác gồm: o cho bát phân, x cho thập lục phân, f cho số thực dạng thập phân, c cho một ký tự đơn (nhận số nguyên hoặc chuỗi một ký tự).

Lớp formatter

Lớp formatter là một trong các lớp chuỗi tích hợp. Nó cung cấp khả năng thay thế biến phức tạp và định dạng giá trị bằng phương thức format(). Nó cho phép bạn tạo và tùy biến hành vi định dạng chuỗi của riêng mình bằng cách ghi đè các phương thức công khai: format(), vformat(). Nó có một số phương thức dự định được các lớp con thay thế: parse(), get_field(), get_value(), check_unused_args(), format_field() và convert_field(). Tuy nhiên, để đơn giản, bạn sẽ chỉ xem format() — hàm được dùng phổ biến nhất — hoạt động như thế nào...

print("I bought {0} Euro worth of {1}!".format(200,'cookies')) #Truy cập giá trị theo vị trí
I bought 200 Euro worth of cookies!
print("I bought {total} Euro worth of {item}!".format(total = 200, item = 'cookies')) #Truy cập giá trị theo tên
I bought 200 Euro worth of cookies!
'{:#<10}'.format('Cake') #Căn trái từ 'Cake' trong độ rộng 10, lấp khoảng trống bằng '#'
'Cake######'
'{:#^10}'.format('Cake') #Căn giữa từ 'Cake' trong độ rộng 10, lấp khoảng trống bằng '#'
'###Cake###'
'{:#>10}'.format('Cake') #Căn phải từ 'Cake' trong độ rộng 10, lấp khoảng trống bằng '#'
'######Cake'
for num in range(1,10): 
        print('{0:{width}}'.format(num, width=5), end=' ')
    1     2     3     4     5     6     7     8     9 

Template Strings

Thay vì phép thay thế dựa trên % thông thường, template hỗ trợ phép thay thế dựa trên $. Lý do giới thiệu template trong Python 2.4 là dù định dạng chuỗi bằng % mạnh mẽ và phong phú, nó dễ lỗi và khá nghiêm ngặt về định dạng theo sau '%', khiến nó phức tạp. Một lỗi phổ biến với định dạng % là quên ký tự định dạng phía sau, ví dụ: chữ e trong %(variabl)e.

Templates có một số phương thức: substitute() và safe_substitute(). Đây là cách bạn có thể dùng chúng:

from string import Template #First you will need to import 'Tempalte' class

money = dict(who = 'You', to_whom = 'baker')
Template('$who owe the $to_whom a total of $$100').substitute(money)
'You owe the baker a total of $100'

Để ý $$ trong ví dụ trên chứ?

Đó là vì với template, $$ là ký tự thoát được thay bằng một $ đơn. Đây là một trong các quy tắc của template. Một quy tắc khác là cách bạn định nghĩa định danh trong template: có cú pháp thường gặp $identifier, và cũng có ${identifier}.

Nghĩa là ${identifier} giống như $identifier, nhưng có thể dùng trong các tình huống như:

word = dict(noun = 'feed')
Template('Please don\'t stop ${noun}ing me').substitute(word)
"Please don't stop feeding me"

Hãy xem bạn có thể dùng substitute() và safe_substitute() như thế nào.

fact = Template('$alter_ego is weak but wait till he transforms to $superhero!')
fact.substitute(alter_ego='Bruce Banner', superhero='Hulk')
'Bruce Banner is weak but wait till he transforms to Hulk!'
hero = dict(alter_ego='Peter Parker')
fact.substitute(hero)
---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

<ipython-input-244-c82f6a2ebc02> in <module>()
      1 hero = dict(alter_ego='Peter Parker')
----> 2 fact.substitute(hero)


~/anaconda3/envs/tensorflow/lib/python3.5/string.py in substitute(*args, **kws)
    127             raise ValueError('Unrecognized named group in pattern',
    128                              self.pattern)
--> 129         return self.pattern.sub(convert, self.template)
    130 
    131     def safe_substitute(*args, **kws):


~/anaconda3/envs/tensorflow/lib/python3.5/string.py in convert(mo)
    117             named = mo.group('named') or mo.group('braced')
    118             if named is not None:
--> 119                 val = mapping[named]
    120                 # We use this idiom instead of str() because the latter will
    121                 # fail if val is a Unicode containing non-ASCII characters.


KeyError: 'superhero'

Ví dụ trên phát sinh lỗi vì superhero chưa được định nghĩa. Tuy nhiên, hãy thử cách này...

fact.safe_substitute(hero)
'Peter Parker is weak but wait till he transforms to $superhero!'

safe_substitute() là một trong những ưu điểm của template.

Tại sao lại có nhiều lựa chọn định dạng chuỗi như vậy, bạn hỏi?

Chủ yếu là vấn đề ưu tiên cú pháp. Thường là đánh đổi giữa đơn giản và dài dòng, và cũng phụ thuộc vào mức quen thuộc của bạn với các cú pháp sẵn có. Ví dụ, dùng % để định dạng chuỗi sẽ tự nhiên với những người có nền tảng C. Templates trong Python thì dễ viết, trong khi dùng format() có thể dài hơn nhưng có nhiều tính năng hơn.

Chuỗi định dạng f-string (Formatted String Literal)

Đây là một phương pháp định dạng chuỗi khác được thêm vào từ Python 3.6. Chuỗi định dạng hay f-string là chuỗi có tiền tố 'f' hoặc 'F'. Bạn có thể đặt các định danh dùng trong chuỗi trong ngoặc nhọn { }.

Tại sao lại thêm một cách định dạng nữa? Tính thực dụng và đơn giản là điều tuyệt vời — đó là lý do!

Xem các ví dụ dưới đây để thấy vì sao f-string thực sự là cách đơn giản và thực tế nhất để định dạng chuỗi trong Python.

alter_ego = 'Peter Parker' superhero = 'spiderman' f'{alter_ego} is weak but wait till he transforms to {superhero}!'

Lưu ý: Đoạn mã trên chỉ hoạt động với Python 3.6 trở lên. Để kiểm tra phiên bản Python đã cài, gõ: python -V trên terminal. Hoặc bạn cũng có thể dùng mô-đun sys trong Python. Để dùng, chỉ cần làm như sau:

import sys
sys.version

Chuỗi định dạng thực chất là các biểu thức được đánh giá tại thời gian chạy, nghĩa là bạn có thể dùng bất kỳ biểu thức Python nào trong ngoặc nhọn của f-string — đây là một ưu điểm lớn khác của f-string.

f'{alter_ego} is weak but wait till he transforms to {superhero.capitalize()}!'

f-string đã đủ tuyệt vời chưa! Nhưng còn hơn thế nữa... f-strings cũng nhanh hơn so với ba phương pháp bạn đã thấy trước đó. Lý do là chúng được phân tích trước và lưu dưới dạng bytecode hiệu quả để thực thi nhanh hơn.

Kéo đúng “dây”!

Bạn đã đi đến cuối hướng dẫn, xin chúc mừng! Bạn đã thấy chuỗi là gì, học về slicing chuỗi và một số thao tác có thể thực hiện trên chuỗi. Bạn cũng đã thấy nhiều cách để định dạng chuỗi. Nhưng hãy nhớ, chìa khóa để thành thạo bất kỳ kỹ thuật nào là luyện tập!

Chuỗi là một trong nhiều kiểu dữ liệu của Python. Hãy xem khóa học Data Types for Data Science của DataCamp để tìm hiểu thêm về list, dictionary, tuple và set. Trong khóa học này bạn có thể vận dụng kiến thức về kiểu dữ liệu để sử dụng. Bạn sẽ làm việc với dữ liệu giao thông khu vực đô thị Chicago cho mục đích khoa học dữ liệu. Hãy truy cập để tự mình khám phá...

Chủ đề
Python
Khoa học Dữ liệu

Các khóa học Python tại DataCamp

Khóa học

Các kiểu dữ liệu trong Python

4 giờ
88.5K
Củng cố và mở rộng kiến thức của bạn về các kiểu dữ liệu Python như danh sách, từ điển và bộ, tận dụng chúng để giải quyết các vấn đề Khoa học dữ liệu.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow