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.

Biểu thức chính quy (Regex) trong Python

Biểu thức chính quy (regex) là một công cụ mạnh mẽ và linh hoạt được sử dụng rộng rãi trong lập trình để xác định và xử lý các mẫu chuỗi phức tạp. Trong nhiều ứng dụng thực tế, từ các công cụ tìm kiếm cho đến các hộp thoại tìm và thay thế của các trình soạn thảo văn bản, biểu thức chính quy đóng vai trò quan trọng trong việc xử lý văn bản. Python, một ngôn ngữ lập trình phổ biến, cung cấp một module tích hợp sẵn tên là re để hỗ trợ làm việc với biểu thức chính quy. Trong bài viết này, mình sẽ tìm hiểu cách sử dụng biểu thức chính quy trong Python, từ các mẫu đơn giản đến phức tạp, và cách áp dụng chúng để giải quyết các vấn đề thực tiễn. Bạn sẽ được tìm hiểu về các hàm phổ biến trong module re và cách sử dụng chúng một cách hiệu quả để tối ưu hóa mã của bạn. Hãy cùng bắt đầu hành trình tìm hiểu biểu thức chính quy trong Python để làm cho việc xử lý văn bản trở nên dễ dàng và hiệu quả hơn.

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ề biểu thức chính quy trong Python

Biểu thức chính quy (regex hoặc regexp) là các mẫu tìm kiếm. Các ví dụ điển hình của biểu thức chính quy bao gồm các mẫu để khớp với địa chỉ email, số điện thoại, và số thẻ tín dụng.

Biểu thức chính quy thực chất là một ngôn ngữ lập trình chuyên biệt được nhúng trong Python. Bạn có thể tương tác với biểu thức chính quy thông qua module re tích hợp sẵn trong Python.

Screenshot 202024 07 06 20222243 png

Ví dụ về một biểu thức chính quy đơn giản

'\d'

Trong ví dụ này, biểu thức chính quy là một chuỗi chứa mẫu tìm kiếm. '\d' là một tập ký tự số khớp với bất kỳ chữ số nào từ 0 đến 9.

Bài viết này được đăng tại [free tuts .net]

Lưu ý rằng bạn sẽ học cách xây dựng các mẫu phức tạp và nâng cao hơn trong các hướng dẫn tiếp theo. Hướng dẫn này tập trung vào các hàm xử lý biểu thức chính quy.

Sử dụng biểu thức chính quy trong Python

Để sử dụng biểu thức chính quy, bạn làm theo các bước sau:

Import module re:

import re

Biên dịch biểu thức chính quy thành đối tượng Pattern:

p = re.compile('\d')

Sử dụng một trong các phương thức của đối tượng Pattern để khớp với chuỗi:

s = "Python 3.10 was released on October 04, 2021"
result = p.findall(s)

print(result)

Kết quả:

['3', '1', '0', '0', '4', '2', '0', '2', '1']

Phương thức findall() trả về một danh sách các chữ số đơn lẻ trong chuỗi s.

import re

p = re.compile('\d')
s = "Python 3.10 was released on October 04, 2021"

results = p.findall(s)
print(results)

Bên cạnh phương thức findall(), đối tượng Pattern còn có các phương thức quan trọng khác cho phép bạn khớp với một chuỗi:

Phương thức Mục đích
match() Tìm mẫu ở đầu chuỗi
search() Trả về match đầu tiên của mẫu trong chuỗi
findall() Trả về tất cả các match của mẫu trong chuỗi
finditer() Trả về tất cả các match của mẫu dưới dạng iterator

Các hàm biểu thức chính quy trong Python

Ngoài lớp Pattern, module re còn có một số hàm để khớp một chuỗi với một mẫu:

  • match()
  • search()
  • findall()
  • finditer()

Các hàm này có tên giống như các phương thức của đối tượng Pattern và cũng nhận các đối số tương tự. Tuy nhiên, bạn không cần phải biên dịch biểu thức chính quy trước khi sử dụng chúng.

Ví dụ sau đây cho thấy chương trình tương tự sử dụng hàm findall() thay vì phương thức findall() của đối tượng Pattern:

import re

s = "Python 3.10 was released on October 04, 2021."
results = re.findall('\d', s)
print(results)

Sử dụng các hàm trong module re gọn gàng hơn so với các phương thức của đối tượng Pattern vì bạn không phải biên dịch biểu thức chính quy thủ công.

Hàm search()

Hàm search() tìm kiếm một mẫu trong một chuỗi. Nếu có một match, nó trả về đối tượng Match đầu tiên hoặc None nếu không tìm thấy. Ví dụ:

import re

s = "Python 3.10 was released on October 04, 2021."
pattern = '\d{2}'
match = re.search(pattern, s)

print(type(match))
print(match)

Kết quả:

<class 're.Match'>
<re.Match object; span=(9, 11), match='10'>

Trong ví dụ này, hàm search() trả về hai chữ số đầu tiên trong chuỗi s dưới dạng đối tượng Match.

Đối tượng Match

Đối tượng Match cung cấp thông tin về chuỗi đã khớp. Nó có các phương thức quan trọng sau:

Phương thức Mô tả
group() Trả về chuỗi đã khớp
start() Trả về vị trí bắt đầu của match
end() Trả về vị trí kết thúc của match
span() Trả về một tuple (start, end) chỉ định vị trí của match

Ví dụ sau đây kiểm tra đối tượng Match:

import re

s = "Python 3.10 was released on October 04, 2021."
result = re.search('\d', s)

print('Matched string:', result.group())
print('Starting position:', result.start())
print('Ending position:', result.end())
print('Positions:', result.span())

Kết quả:

Matched string: 3
Starting position: 7
Ending position: 8
Positions: (7, 8)

Hàm match()

Hàm match() trả về đối tượng Match nếu nó tìm thấy mẫu ở đầu chuỗi. Ví dụ:

import re

l = ['Python', 
    'CPython is an implementation of Python written in C', 
    'Jython is a Java implementation of Python',
    'IronPython is Python on .NET framework']

pattern = '\wython'
for s in l:
    result = re.match(pattern, s)
    print(result)

Kết quả:

<re.Match object; span=(0, 6), match='Python'>
None
<re.Match object; span=(0, 6), match='Jython'>
None

Trong ví dụ này, \w là tập ký tự từ khớp với bất kỳ ký tự nào.

'\wython' khớp với bất kỳ chuỗi nào bắt đầu bằng một ký tự từ duy nhất và theo sau là chuỗi ký tự ython, ví dụ: Python.

Chuỗi sau khớp với mẫu:

Python
Jython is a Java implementation of Python

Và chuỗi sau không khớp:

CPython is an implementation of Python written in C
IronPython is Python on .NET framework

Hàm fullmatch()

Hàm fullmatch() trả về đối tượng Match nếu toàn bộ chuỗi khớp với mẫu hoặc None nếu không khớp. Ví dụ sau đây sử dụng hàm fullmatch() để khớp một chuỗi với bốn chữ số:

import re

s = "2021"
pattern = '\d{4}'
result = re.fullmatch(pattern, s)
print(result)

Kết quả:

<re.Match object; span=(0, 4), match='2021'>

Mẫu '\d{4}' khớp với một chuỗi có bốn chữ số. Do đó, hàm fullmatch() trả về chuỗi 2021.

Nếu bạn đặt số 2021 ở giữa hoặc cuối chuỗi, hàm fullmatch() sẽ trả về None. Ví dụ:

import re

s = "Python 3.10 released in 2021"
pattern = '\d{4}'
result = re.fullmatch(pattern, s)
print(result)

Kết quả:

None

Biểu thức chính quy và chuỗi thô trong Python

Điều quan trọng cần lưu ý là Python và biểu thức chính quy là các ngôn ngữ lập trình khác nhau. Chúng có cú pháp riêng của mình.

Module re là giao diện giữa Python và ngôn ngữ lập trình biểu thức chính quy. Nó hoạt động như một bộ thông dịch giữa chúng.

Để xây dựng một mẫu, biểu thức chính quy thường sử dụng dấu gạch chéo ngược \ ví dụ \d\w. Nhưng điều này xung đột với việc sử dụng dấu gạch chéo ngược của Python cho mục đích tương tự trong chuỗi ký tự.

Ví dụ, giả sử bạn cần khớp chuỗi sau:

s = '\section'

Trong Python, dấu gạch chéo ngược (\) là một ký tự đặc biệt. Để xây dựng một biểu thức chính quy, bạn cần thoát các dấu gạch chéo ngược bằng cách đặt trước mỗi dấu gạch chéo ngược bằng một dấu gạch chéo ngược:

pattern = '\\section'

Trong biểu thức chính quy, mẫu phải là \\section. Tuy nhiên, để biểu diễn mẫu này trong chuỗi ký tự trong Python, bạn cần sử dụng thêm hai dấu gạch chéo ngược để thoát cả hai dấu gạch chéo ngược lần nữa:

pattern = '\\\\section'

Đơn giản mà nói, để khớp một dấu gạch chéo ngược (''), bạn phải viết \\\\ vì biểu thức chính quy phải là \\ và mỗi dấu gạch chéo ngược phải được biểu diễn dưới dạng \\ trong chuỗi ký tự Python.

Điều này dẫn đến nhiều dấu gạch chéo ngược lặp lại. Do đó, làm cho các biểu thức chính quy khó đọc và hiểu.

Một giải pháp là sử dụng chuỗi thô trong Python cho biểu thức chính quy vì chuỗi thô xử lý dấu gạch chéo ngược (\) như một ký tự bình thường, không phải ký tự đặc biệt.

Để biến chuỗi thông thường thành chuỗi thô, bạn đặt trước nó bằng chữ r hoặc R. Ví dụ:

import re

s = '\section'
pattern = r'\\section'
result = re.findall(pattern, s)

print(result)

Kết quả:

['\\section']

Lưu ý rằng trong Python '\section''\\section' là như nhau:

p1 = '\\section'
p2 = '\section'

print(p1 == p2)  # true

Trong thực tế, bạn sẽ thấy các biểu thức chính quy được xây dựng trong Python sử dụng chuỗi thô.

Kết bài

Biểu thức chính quy là một công cụ mạnh mẽ trong Python, cho phép bạn xác định và xử lý các mẫu chuỗi phức tạp một cách hiệu quả. Bằng cách sử dụng đối tượng Pattern hoặc các hàm trong module re, bạn có thể dễ dàng tìm kiếm và thao tác với các mẫu chuỗi trong văn bản. Để tránh những rắc rối khi phải thoát các ký tự đặc biệt, việc sử dụng chuỗi thô (raw string) là một phương pháp hữu ích và tiện lợi.

Qua hướng dẫn này, bạn đã được làm quen với cách xây dựng và sử dụng biểu thức chính quy trong Python, từ những ví dụ đơn giản đến phức tạp. Với kiến thức này, bạn có thể áp dụng biểu thức chính quy vào nhiều tình huống thực tế, từ việc kiểm tra định dạng email, số điện thoại đến việc tìm kiếm và thay thế văn bản. Hy vọng rằng, bạn sẽ cảm thấy tự tin hơn trong việc sử dụng biểu thức chính quy để giải quyết các vấn đề về xử lý văn bản trong các dự án lập trình của mình.

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