--- title: Virgil - Practice Python - S41 String Manipulation tags: Virgil, LearnWorld, PracticePython --- # String Khi làm việc với dữ liệu, bên cạnh số thì text cũng là một dạng dữ liệu chính. Trong Python xử lý text còn gọi là string manipulation. Bạn cần nắm vững kiểu dữ liệu string để có thể xử lý dữ liệu dạng text một cách linh hoạt. String có thể được định nghĩa bới dấu nháy đơn `'` hoặc nháy kép `"`. Nếu bạn muốn có dấu nháy đơn hoặc nháy kép bên trong một string, bạn có thể: ```python print("doesn't") # đặt dấu nháy kép bên ngoài print('"Yes" they said') # đặt dấu nháy đơn bên ngoài ``` Bạn cũng có thể dùng `\` đứng trước các ký tự đặc biệt: ```python print('doesn\'t') print("\"Yes\" they said") ``` Một trong những ký tự đặc biệt là dấu xuống dòng được định nghĩa bằng `\n`: ```python s = 'First line.\nSecond line.' # \n means newline print(s) # Output: # First line. # Second line ``` String có thể được định nghĩa bằng triple-quotes: `"""...""" or '''...'''`, cho phép bạn tạo string có nhiều dòng một cách dễ đọc hơn. Docstrings của function cũng được viết bằng cách này: ```python s = '''First line. Second line.''' print(s) # Output: # First line. # Second line ``` Bạn có thể ghép hai string bằng dấu `+`: ```python word_1 = 'Hello' word_2 = 'World' print(word_1 + ' ' + word_2 + '!') # Output: Hello World! ``` Bạn cũng có thể tạo 1 string dài từ một string ngắn bằng cách nhân string ngắn với một số `int`: ```python # Sometime good for debugging print('-'*20) # Output: -------------------- ``` ## Indexing and Slicing Indexing và Slicing trong string giống với list. Điểm khác biệt là "phần tử" trong string là các ký tự. **Indexing** ```python school = 'CoderSchool' # character in position 0 print(school[0]) # Output: C # character in position 5 print(school[5]) # Output: S # last character print(school[-1]) # Output: l # second-last character print(school[-2]) # Output: o ``` **Slicing** ```python # characters from position 0 (included) to 5 (excluded) print(school[0:5]) # Output: Coder # character from the beginning to position 2 (excluded) print(school[:2]) # Output: Co # characters from position 5 (included) to the end print(school[5:]) # Output: School # last two characters print(school[-2:]) # Output: ol # reverse print(school[::-1]) # Output: loohcSredoC ``` ## Formatted string literals Formatted string literals hay còn gọi là f-string là cách bạn chèn các giá trị hoặc biểu thức vào bên trong một string thông qua dấu `{}`. f-string bắt đầu bằng chữ `f` phía trước string: ```python name = 'CoderSchool' print(f'The name of the school is {name}') # Output: The name of the school is CoderSchool height = 177 weight = 80 print(f'He is {height} cm tall and weight {weight} kg.') # Output: He is 177 cm tall and weight 80 kg. ``` ## String manipulation Python có nhiều methods cho string giúp bạn thao tác và xử lý string hiệu quả. Thay đổi chữ viết hoa viết thường bằng `upper()`, `lower()`, `capitalize()`, `swapcase()`: ```python fox = 'tHe qUICk bROWn fOx.' print(fox.upper()) # Output: THE QUICK BROWN FOX. print(fox.lower()) # Output: the quick brown fox. print(fox.capitalize()) # Output: The quick brown fox. print(fox.swapcase()) # Output: ThE QuicK BrowN FoX. ``` Một thao tác thông dụng khác là loại bỏ các ký tự ở đầu và cuối một string, ví dụ khoảng trống `' '` bằng `strip()`, `rstrip()`, `lstrip()` ```python line = ' this is the content ' # Remove all blank spaces at the beginning and the end print(line.strip()) # Output: 'this is the content' # Remove the right side only print(line.rstrip()) # Output: ' this is the content' # Remove the left side only print(line.lstrip()) # Output: 'this is the content ' # Remove the dash at the beginning and the end num = '---123--' print(num.strip('-')) # Output: '123' ``` Bạn có thể kiểm tra một string có bắt đầu/kết thúc bằng một string cho trước bằng `startswith()`/`endswith()`: ```python name = 'CoderSchool' print(name.startswith('abc')) # Output: False print(name.startswith('Coder')) # Output: True print(name.endswith('ol')) # Output: True print(name.endswith('school')) # Output: False (School, not school) ``` Bạn có thể tìm kiếm vị trí của một string con trong một string mẹ bằng `find()` hoặc `index()`. Nếu string cần tìm không xuất hiện, `find()` sẽ trả về `-1`, còn `index()` sẽ báo lỗi: ```python text = 'abcdef' print(text.find('b')) # Output: 1 print(text.index('b')) # Output: 1 print(text.find('z')) # Output: -1 print(text.index('z')) # Output: ValueError: substring not found ``` Bạn không thể trực tiếp thay đổi ký tự trong string: ```python text = 'abcdef' text[0] = 'A' # TypeError: 'str' object does not support item assignment ``` Đây gọi là immutable, tương tự tuple cũng là immutable còn list thì là mutable. Tuy nhiên bạn có thể thay thế một substring trong string bằng method `replace()`: ```python line = 'the quick brown fox jumped over a lazy dog' new_line = line.replace('brown', 'red') print(line) # Output: the quick brown fox jumped over a lazy dog print(new_line) # Output: the quick red fox jumped over a lazy dog ``` Lưu ý, `replace()` không thay đổi string `line` mà trả về giá trị một string mới mà từ `brown` được thay bằng `red`. **Biến đổi string thành list và ngược lại bằng `split()` và `join()`** Đây là một thao tác cũng rất thông dụng mà bạn nên nắm vững. Bạn có thể tách một string thành list của các từ bằng method `split()`: ```python line = 'the quick brown fox jumped over a lazy dog' print(line.split()) # Output: ['the', 'quick', 'brown', 'fox', 'jumped', 'over', 'a', 'lazy', 'dog'] ``` `split()` mặc định tách các từ cách nhau bởi dấu trống `' '` nhưng bạn cũng có thể đưa vào ký tự muốn tách: ```python datestr = '1956-01-31' year, month, day = datestr.split('-') print(year) # Output: 1956 print(month) # Output: 01 print(day) # Output: 31 ``` Lưu ý, `datestr.split('-')` trả về list `['1956', '01', '31']` sau đó ba giá trị này sẽ được gán vào ba biến `year`, `month`, và `day` tương ứng theo thứ tự. Ngược lại với `split()`, `join()` trả về một string từ một list các từ: ```python print(' '.join(['Hello', 'World', '!'])) # Output: Hello World ! print('-'.join(['Hello', 'World', '!'])) # Output: Hello-World-! ``` Bạn có thể thấy string gọi method `join()` chính là string đứng giữa các từ sau khi "join".