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:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top