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 Flags của Regex trong Python

Trong lập trình Python, biểu thức chính quy (regular expression) là một công cụ mạnh mẽ để xử lý và tìm kiếm chuỗi. Để tận dụng hết khả năng của biểu thức chính quy, việc hiểu và sử dụng các cờ (flags) là rất quan trọng. Các flags này không chỉ giúp thay đổi cách bộ máy regex hoạt động mà còn mang lại sự linh hoạt trong việc kiểm soát quá trình khớp mẫu. Trong bài viết này, mình sẽ cùng tìm hiểu về các flags trong biểu thức chính quy Python và cách chúng có thể giúp bạn xử lý chuỗi một cách 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ề các flags trong biểu thức chính quy Python

Các hàm biểu thức chính quy như findall, finditer, search, match, split, sub,... có tham số flags cho phép nhận một hoặc nhiều flags biểu thức chính quy.

Kể từ Python 3.6, các flags biểu thức chính quy là các instance của lớp liệt kê RegexFlag trong module re. Bảng sau đây liệt kê các flags có sẵn và ý nghĩa của chúng:

flags Alias Inline Flag Ý nghĩa
re.ASCII re.A ?a re.ASCII chỉ liên quan đến các mẫu byte. Nó khiến các ký tự như \w, \W, \b, \B, \d, \D, và \S chỉ khớp với các ký tự ASCII thay vì khớp toàn bộ Unicode.
re.DEBUG N/A N/A re.DEBUG hiển thị thông tin gỡ lỗi của mẫu đã biên dịch.
re.IGNORECASE re.I ?i Thực hiện khớp không phân biệt chữ hoa và chữ thường. Nó có nghĩa là [A-Z] cũng sẽ khớp với các chữ cái thường.
re.LOCALE re.L ?L re.LOCALE chỉ liên quan đến mẫu byte. Nó làm cho các ký tự như \w, \W, \b, \B và việc khớp không phân biệt chữ hoa chữ thường phụ thuộc vào địa phương hiện tại. Flagsre.LOCALE không tương thích với flags re.ASCII.
re.MULTILINE re.M ?m re.MULTILINE làm cho ^ khớp ở đầu chuỗi và ở đầu mỗi dòng, và $ khớp ở cuối chuỗi và ở cuối mỗi dòng.
re.DOTALL re.S ?s Theo mặc định, dấu chấm (.) khớp với bất kỳ ký tự nào ngoại trừ ký tự xuống dòng. re.DOTALL làm cho dấu chấm (.) khớp với tất cả các ký tự bao gồm cả ký tự xuống dòng.
re.VERBOSE re.X ?x re.VERBOSE cho phép bạn tổ chức mẫu thành các phần hợp lý một cách trực quan và thêm các bình luận.

Để kết hợp hai hoặc nhiều flags, bạn sử dụng toán tử | như sau:

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

re.A | re.M | re.S

Các ví dụ về flags biểu thức chính quy trong Python

Ví dụ về flags re.IGNORECASE

Ví dụ sau sử dụng hàm findall() để tìm tất cả các ký tự thường trong tập [a-z] trong một chuỗi:

import re

s = 'Python is awesome'
pattern = '[a-z]+'

l = re.findall(pattern, s)
print(l)

Kết quả:

['ython', 'is', 'awesome']

Chữ P không được bao gồm trong kết quả vì nó không nằm trong tập [a-z].

Ví dụ sau sử dụng flags re.IGNORECASE:

import re

s = 'Python is awesome'
pattern = '[a-z]+'

l = re.findall(pattern, s, re.IGNORECASE)
print(l)

Kết quả:

['Python', 'is', 'awesome']

Mặc dù mẫu chỉ khớp với các ký tự trong tập [a-z], flags re.IGNORECASE hướng dẫn bộ máy regex cũng khớp với các ký tự trong tập [A-Z].

Ví dụ về flags re.MULTILINE

Ví dụ sau sử dụng ký tự mỏ neo ^ để khớp với một hoặc nhiều ký tự từ đầu của chuỗi:

import re

s = '''Regex 
Flags'''

pattern = '^\w+'

l = re.findall(pattern, s)
print(l)

Kết quả:

['Regex']

Chuỗi s có hai dòng. Ký tự ^ chỉ khớp ở đầu chuỗi như mong đợi.

Nếu bạn sử dụng flags re.MULTILINE, ký tự ^ sẽ khớp ở đầu mỗi dòng. Ví dụ:

import re

s = '''Regex 
Flags'''

pattern = '^\w+'

l = re.findall(pattern, s, re.MULTILINE)
print(l)

Kết quả:

['Regex', 'Flags']

Ví dụ về flags re.DOTALL

Trong ví dụ này, mẫu .+ khớp với một hoặc nhiều ký tự ngoại trừ ký tự xuống dòng:

import re

s = '''Regex
Flags'''

pattern = '.+'

l = re.findall(pattern, s)
print(l)

Kết quả:

['Regex', 'Flags']

Nếu bạn sử dụng flags re.DOTALL, mẫu .+ cũng sẽ khớp với ký tự xuống dòng:

import re

s = '''Regex
Flags'''

pattern = '.+'

l = re.findall(pattern, s, re.DOTALL)
print(l)

Kết quả:

['Regex\nFlags']

Ví dụ về flags re.VERBOSE

Ví dụ sau cho thấy cách sử dụng flags re.VERBOSE để viết mẫu thành các phần với các bình luận:

import re

s = 'Python 3'

pattern = r'''^(\w+) # khớp với một hoặc nhiều ký tự ở đầu chuỗi
               \s*   # khớp với không hoặc nhiều khoảng trắng
              (\d+)$ # khớp với một hoặc nhiều chữ số ở cuối chuỗi'''

l = re.findall(pattern, s, re.VERBOSE)
print(l)

Kết quả:

[('Python', '3')]

Trong ví dụ này, flags re.VERBOSE cho phép chúng ta thêm các khoảng trắng và bình luận vào biểu thức chính quy để giải thích từng quy tắc riêng lẻ.

Ví dụ về flags re.ASCII

Ví dụ sau khớp với các từ có hai ký tự:

import re

s = '作法 is Pythonic in Japanese'
pattern = r'\b\w{2}\b'

l = re.findall(pattern, s)
print
(l)

Kết quả:

['作法', 'is', 'in']

Tuy nhiên, nếu bạn sử dụng flags re.ASCII, các kết quả khớp chỉ bao gồm các ký tự ASCII:

import re

s = '作法 is Pythonic in Japanese'
pattern = r'\b\w{2}\b'

l = re.findall(pattern, s, re.ASCII)
print(l)

Kết quả:

['is', 'in']

Trong ví dụ này, từ 作法 đã bị loại khỏi danh sách kết quả.

Kết bài

Thông qua việc nắm vững các flags trong biểu thức chính quy Python, bạn có thể tùy chỉnh cách bộ máy regex hoạt động để phù hợp với nhu cầu của mình. Các flagsnày cung cấp sự linh hoạt và sức mạnh trong việc xử lý và tìm kiếm chuỗi, giúp bạn giải quyết các bài toán một cách hiệu quả hơn. Hãy áp dụng những kiến thức này vào các tình huống thực tế để thấy rõ hơn lợi ích của biểu thức chính quy trong việc quản lý và phân tích dữ liệu.

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