PYTHON REGEX
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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ể.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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àm sub() sẽ thay thế. Nếu bạn truyền giá trị 0 hoặc bỏ qua tham số này, hàm sub() 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.

Cùng chuyên mục:

Sử dụng câu lệnh raise from trong Python

Sử dụng câu lệnh raise from trong Python

Ngoại lệ tùy chỉnh trong Python

Ngoại lệ tùy chỉnh trong Python

Ngoại lệ Raise trong Python

Ngoại lệ Raise trong Python

Tìm hiểu về các ngoại lệ trong Python

Tìm hiểu về các ngoại lệ trong Python

Tìm hiểu về decorator dataclass trong Python

Tìm hiểu về decorator dataclass trong Python

Ví dụ sử dụng metaclass trong Python

Ví dụ sử dụng metaclass trong Python

Lớp Metaclass trong Python

Lớp Metaclass trong Python

Tìm hiểu về Class Type trong Python

Tìm hiểu về Class Type trong Python

Phương thức __new__ trong Python

Phương thức __new__ trong Python

Phân biệt Data Descriptor và Non-data Descriptor trong Python

Phân biệt Data Descriptor và Non-data Descriptor trong Python

Mô tả Descriptors trong Python

Mô tả Descriptors trong Python

Tìm hiểu về các lớp mixin trong Python

Tìm hiểu về các lớp mixin trong Python

Đa kế thừa trong Python

Đa kế thừa trong Python

Nguyên tắc đảo ngược sự phụ thuộc trong Python

Nguyên tắc đảo ngược sự phụ thuộc trong Python

Interface Segregation Principle - ISP trong Python.

Interface Segregation Principle - ISP trong Python.

Nguyên tắc thay thế Liskov - LSP trong Python

Nguyên tắc thay thế Liskov - LSP trong Python

Nguyên tắc Đóng-Mở trong Python

Nguyên tắc Đóng-Mở trong Python

Single Responsibility Principle trong Python

Single Responsibility Principle trong Python

Cách sử dụng hàm Auto() của Python

Cách sử dụng hàm Auto() của Python

Tùy chỉnh và mở rộng lớp Enum trong Python

Tùy chỉnh và mở rộng lớp Enum trong Python

Top