Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Hàm sub() của Regex trong Python
Trong lập trình Python, việc xử lý các chuỗi ký tự phức tạp là một yêu cầu thường xuyên và quan trọng. Để giải quyết vấn đề này một cách hiệu quả, Python cung cấp module re
hỗ trợ làm việc với các biểu thức chính quy (regex). Một trong những hàm hữu ích của module này là sub()
. Hàm sub()
cho phép thay thế các phần của chuỗi khớp với một mẫu regex cụ thể bằng một giá trị thay thế mới. Điều này rất hữu ích trong nhiều tình huống, từ việc định dạng lại dữ liệu cho đến việc lọc và thay thế nội dung trong văn bản. Hãy cùng tìm hiểu chi tiết cách sử dụng hàm sub()
trong Python qua các ví dụ cụ thể.
Giới thiệu về hàm sub() trong Python regex
sub()
là một hàm trong module re
của Python, được sử dụng để xử lý các biểu thức chính quy. Hàm sub()
có cú pháp như sau:
re.sub(pattern, repl, string, count=0, flags=0)
Trong cú pháp này:
pattern
là biểu thức chính quy bạn muốn tìm kiếm. Ngoài một biểu thức chính quy,pattern
có thể là một đối tượng Pattern.repl
là giá trị thay thế.string
là chuỗi đầu vào.- Tham số
count
chỉ định số lượng tối đa các mẫu khớp mà hàmsub()
sẽ thay thế. Nếu bạn truyền giá trị 0 hoặc bỏ qua tham số này, hàmsub()
sẽ thay thế tất cả các mẫu khớp. flags
là một hoặc nhiều cờ của regex, giúp thay đổi hành vi mặc định của biểu thức chính quy.
Hàm sub()
tìm kiếm các mẫu trong chuỗi và thay thế các chuỗi khớp với giá trị thay thế (repl
). Nếu hàm sub()
không tìm thấy mẫu khớp nào, nó sẽ trả về chuỗi gốc. Ngược lại, hàm sub()
sẽ trả về chuỗi sau khi thay thế các mẫu khớp.
Bài viết này được đăng tại [free tuts .net]
Lưu ý rằng, hàm sub()
thay thế các mẫu khớp không chồng lấp từ trái sang phải. Bạn sẽ thấy rõ điều này trong các ví dụ sau đây.
Các ví dụ về hàm sub() trong Python regex
Hãy cùng xem một số ví dụ về cách sử dụng hàm sub()
.
Sử dụng hàm sub() để trả về số điện thoại không có ký tự đặc biệt
Ví dụ sau sử dụng hàm sub()
để biến số điện thoại (212)-456-7890
thành 2124567890
:
import re phone_no = '(212)-456-7890' pattern = '\D' result = re.sub(pattern, '', phone_no) print(result)
Kết quả:
2124567890
Trong ví dụ này, \D
là tập ký tự không phải là chữ số. Vì vậy, hàm sub()
thay thế tất cả các ký tự không phải là số bằng chuỗi rỗng ''
.
Sử dụng hàm sub() để thay thế các mẫu khớp không chồng lấp từ trái sang phải
Ví dụ sau thay thế 00
bằng ''
trong chuỗi 00000
:
import re pattern = '00' s = '00000' result = re.sub(pattern, '', s) print(result)
Kết quả:
0
Trong ví dụ này, chúng ta thay thế hai số không (00
) bằng chuỗi rỗng. Do đó, hai số không đầu tiên được thay thế, tiếp theo là hai số không tiếp theo, và cuối cùng, chữ số cuối cùng vẫn không thay đổi.
Sử dụng hàm sub() với tham chiếu ngược (backreference)
Ví dụ sau sử dụng hàm sub()
để thay thế văn bản được bao quanh bởi dấu (*) bằng thẻ <b>
trong HTML:
import re s = 'Make the World a *Better Place*' pattern = r'\*(.*?)\*' replacement = r'<b>\1</b>' html = re.sub(pattern, replacement, s) print(html)
Kết quả:
Make the World a <b>Better Place</b>
Trong ví dụ này, mẫu r'\*(.*?)\*'
tìm văn bản bắt đầu và kết thúc bằng dấu sao (*). Nó có một nhóm bắt (capturing group) để bắt văn bản giữa hai dấu sao. Tham chiếu ngược \1
đề cập đến nhóm đầu tiên trong mẫu, tức là văn bản giữa hai dấu sao.
Sử dụng hàm sub() với giá trị thay thế là một hàm
Giả sử bạn có một danh sách các chuỗi mà mỗi phần tử chứa cả chữ cái và số:
l = ['A1', 'A2', 'A3']
Và bạn muốn bình phương số trong mỗi phần tử của danh sách. Ví dụ, A1
trở thành A1
, A2
trở thành A4
, và A3
trở thành A9
. Để làm điều này, bạn có thể sử dụng hàm sub()
.
Tham số thứ hai của hàm sub()
(repl
) có thể là một hàm. Trong trường hợp này, hàm sub()
sẽ gọi hàm này cho mỗi mẫu khớp không chồng lấp. Hàm này (repl) nhận một đối tượng Match làm tham số và trả về chuỗi thay thế.
Ví dụ sau minh họa cách sử dụng tham số thứ hai là một hàm:
import re def square(match): num = int(match.group()) return str(num*num) l = ['A1', 'A2', 'A3'] pattern = r'\d+' new_l = [re.sub(pattern, square, s) for s in l] print(new_l)
Kết quả:
['A1', 'A4', 'A9']
Cách hoạt động của ví dụ này như sau:
- Đầu tiên, định nghĩa một danh sách các chuỗi:
l = ['A1', 'A2', 'A3']
Thứ hai, định nghĩa một mẫu \d+
để khớp với một hoặc nhiều chữ số:
pattern = r'\d+'
Thứ ba, thay thế các chữ số bằng bình phương của chúng bằng cách gọi hàm sub()
và truyền hàm square()
:
new_l = [re.sub(pattern, square, s) for s in l]
Cuối cùng, định nghĩa hàm square()
để bình phương chữ số được khớp và trả về giá trị này:
def square(match): num = int(match.group()) return str(num*num)
Kết bài
Qua bài viết này, mình đã tìm hiểu cách sử dụng hàm sub()
trong module re
của Python để thay thế các phần tử khớp với một mẫu regex trong chuỗi. Hàm sub()
không chỉ giúp thực hiện các thay thế cơ bản mà còn hỗ trợ các thay thế phức tạp hơn bằng cách sử dụng nhóm bắt và các hàm thay thế. Việc nắm vững cách sử dụng hàm sub()
sẽ giúp bạn xử lý và thao tác với chuỗi hiệu quả hơn trong các dự án thực tế. Hãy áp dụng những kiến thức này vào công việc hàng ngày để nâng cao khả năng xử lý dữ liệu và làm sạch văn bản của bạn.