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.
![banquyen png](https://freetuts.net/public/banquyen.png)
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.