Regular Expression (biểu thức chính quy) trong Python là một công cụ mạnh mẽ giúp tìm kiếm, khớp mẫu và xử lý chuỗi dữ liệu một cách linh hoạt. Với khả năng xác định và thao tác trên văn bản theo quy tắc nhất định, nó giúp tối ưu hóa quá trình xử lý dữ liệu, kiểm tra định dạng và trích xuất thông tin nhanh chóng. Trong bài viết này, mình sẽ giới thiệu tổng quan về Regular Expression trong Python, cách sử dụng và các ứng dụng thực tế của nó.
Những điểm chính
- Regular Expression trong Python: Hiểu khái niệm biểu thức chính quy và cách nó hỗ trợ xử lý chuỗi hiệu quả.
- Các thành phần quan trọng của Regular Expression: Bao gồm Raw Strings, siêu ký tự (Metacharacters) và các phương thức làm việc với regex như
re.match()
,re.search()
,re.findall()
,re.sub()
,re.compile()
,re.finditer()
. - Ứng dụng của Regular Expression: Tìm từ bắt đầu bằng nguyên âm, sử dụng bộ sửa đổi (Flags), làm việc với Character Classes, nhóm ký tự và các kỹ thuật lặp lại.
- Các kỹ thuật nâng cao: Lặp ít nhất có thể (Nongreedy repetition), sử dụng dấu ngoặc đơn để nhóm, tham chiếu ngược (Backreferences), lựa chọn thay thế và Anchors trong regex.
- Vietnix – Nhà cung cấp dịch vụ lưu trữ chất lượng cao: Tìm hiểu về các dịch vụ tại Vietnix.
- Câu hỏi thường gặp: Giải đáp các thắc mắc phổ biến khi làm việc với Regular Expression trong Python.
Regular Expression trong Python là gì?
Regular Expression trong Python thường được gọi là regex hoặc regexp, là một chuỗi ký tự đặc biệt giúp tìm kiếm, khớp mẫu hoặc thao tác trên chuỗi dữ liệu bằng một cú pháp riêng biệt. Trong Python, Regular Expression thường được sử dụng trong các thuật toán tìm kiếm chuỗi, thay thế hoặc kiểm tra dữ liệu đầu vào.

Đặc biệt, với những dự án xử lý dữ liệu lớn trong khoa học dữ liệu, regex giúp thao tác văn bản nhanh chóng và hiệu quả. Python hỗ trợ Regular Expression thông qua module re
, cung cấp nhiều phương thức giúp làm việc với chuỗi dễ dàng hơn.
Raw Strings
Trong Python, dấu \
(backslash) được sử dụng để biểu diễn các ký tự đặc biệt hoặc định dạng chuỗi theo một cách nhất định. Tuy nhiên, vấn đề phát sinh khi Regular Expression cũng sử dụng ký tự \
để tạo các mẫu đặc biệt. Điều này có thể gây nhầm lẫn khi làm việc với biểu thức chính quy trong Python. Python cung cấp raw string (chuỗi thô) để giải quyết vấn đề này. Khi một chuỗi được đặt trước bởi ký tự r
hoặc R
, nó sẽ được hiểu là raw string, tức là Python không xử lý các ký tự escape (\
).
- Ví dụ minh họa:
normal = "Hello\nVietnix"
print(normal)
# Kết quả:
# Hello
# Vietnix
raw = r"Hello\nVietnix"
print(raw)
# Kết quả:
# Hello\nVietnix
Trong ví dụ trên, chuỗi bình thường (normal
) sẽ diễn giải \n
thành ký tự xuống dòng. Ngược lại, chuỗi thô (raw
) giữ nguyên \n
mà không xử lý nó thành ký tự đặc biệt. Điều này rất hữu ích khi làm việc với biểu thức chính quy, vì nó giúp tránh lỗi khi sử dụng các ký tự như \d
, \w
hoặc \s
trong regex.
Metacharacters – Siêu ký tự
Hầu hết các ký tự trong biểu thức chính quy (Regular Expression) sẽ khớp với chính nó. Tuy nhiên, một số ký tự có ý nghĩa đặc biệt và không khớp với chính nó, được gọi là siêu ký tự (metacharacters). Các siêu ký tự này hoạt động tương tự như dấu *
trong ký tự đại diện (wildcard). Dưới đây là danh sách các siêu ký tự trong Python Regex:
. ^ $ * + ? { } [ ] \ | ( )
Các ký hiệu ngoặc vuông [ and ] biểu thị một tập hợp các ký tự mà bạn muốn khớp. Các ký tự có thể được liệt kê riêng lẻ hoặc dưới dạng một phạm vi các ký tự ngăn cách chúng bằng dấu ‘-‘.
STT | Siêu ký tự | Mô tả |
1 | [abc] | Khớp với bất kỳ ký tự nào trong tập {a, b, c}. |
2 | [a-c] | Dùng khoảng để biểu thị tập ký tự tương đương {a, b, c}. |
3 | [a-z] | Khớp với bất kỳ chữ cái viết thường nào từ a đến z. |
4 | [0-9] | Khớp với bất kỳ chữ số nào từ 0 đến 9. |
5 | [^5] | Phủ định tập ký tự trong []. [ ^5 ] sẽ khớp với bất kỳ ký tự nào ngoại trừ 5. |
“\” là một siêu ký tự thoát, khi theo sau bởi nhiều ký tự khác nhau, nó tạo thành nhiều chuỗi đặc biệt khác nhau. Nếu bạn cần khớp với [ hoặc \, bạn có thể thêm dấu gạch chéo ngược vào trước chúng để xóa ý nghĩa đặc biệt của chúng: \[ hoặc \\. Các tập hợp ký tự được xác định trước được biểu thị bằng các chuỗi đặc biệt bắt đầu bằng ‘\’ được liệt kê bên dưới:
STT | Siêu ký tự | Mô tả |
1 | \d | Khớp với bất kỳ chữ số nào ([0-9]). |
2 | \D | Khớp với bất kỳ ký tự nào không phải số ([^0-9]). |
3 | \s | Khớp với bất kỳ ký tự khoảng trắng nào ([\t\n\r\f\v]). |
4 | \S | Khớp với bất kỳ ký tự nào không phải khoảng trắng ([^\t\n\r\f\v]). |
5 | \w | Khớp với bất kỳ ký tự chữ hoặc số nào ([a-zA-Z0-9_]). |
6 | \W | Khớp với bất kỳ ký tự nào không phải chữ hoặc số ([^a-zA-Z0-9_]). |
7 | . | Khớp với bất kỳ ký tự nào ngoại trừ xuống dòng \n. |
8 | ? | Khớp với 0 hoặc 1 lần xuất hiện của mẫu bên trái. |
9 | + | Khớp với 1 hoặc nhiều lần xuất hiện của mẫu bên trái. |
10 | * | Khớp với 0 hoặc nhiều lần xuất hiện của mẫu bên trái. |
11 | \b | Xác định ranh giới giữa từ và không phải từ. \B là đối lập với \b. |
12 | [..] | Khớp với bất kỳ ký tự nào trong dấu ngoặc vuông. [^..] khớp với bất kỳ ký tự nào không có trong dấu ngoặc vuông. |
13 | \ | Dùng để thoát ý nghĩa đặc biệt của các ký tự, ví dụ \. để khớp với dấu . hoặc \+ để khớp với dấu +. |
14 | {n,m} | Khớp ít nhất n và tối đa m lần xuất hiện của mẫu bên trái. |
15 | a| b | Phù hợp với a hoặc b |
Module re
của Python cung cấp các hàm hữu ích để tìm kiếm và so khớp chuỗi. Nó cho phép tìm mẫu, thay thế chuỗi trùng khớp và thực hiện nhiều thao tác xử lý văn bản khác.
Hàm re.match()
Hàm re.match()
trong Python được sử dụng để kiểm tra xem một chuỗi có khớp với một mẫu biểu thức chính quy (regex) ngay từ đầu hay không. Nếu tìm thấy kết quả khớp, nó trả về một đối tượng match chứa thông tin về vị trí bắt đầu, kết thúc và chuỗi khớp. Nếu không tìm thấy, nó trả về None
.
- Cú pháp:
re.match(pattern, string, flags=0)
- Các tham số:
Tham số | Mô tả |
---|---|
pattern | Biểu thức chính quy cần kiểm tra. |
string | Chuỗi cần kiểm tra, so khớp bắt đầu từ vị trí đầu tiên. |
flags | Các cờ (flags) tùy chọn giúp điều chỉnh cách so khớp, có thể kết hợp bằng toán tử ` |
Giá trị trả về
Hàm re.match()
trong Python được sử dụng để kiểm tra sự trùng khớp giữa một mẫu regex và phần đầu của chuỗi. Dưới đây là cách hoạt động của hàm này:
- Nếu tìm thấy kết quả khớp,
re.match()
trả về một đối tượng match chứa thông tin về kết quả. - Nếu không tìm thấy, hàm trả về
None
. - Đối tượng match có thể truy xuất vị trí bắt đầu và kết thúc của chuỗi khớp bằng phương thức
start()
vàend()
.
- Phương thức của đối tượng match:
Phương thức | Mô tả |
---|---|
group(num=0) | Trả về toàn bộ kết quả khớp hoặc nhóm con cụ thể. |
groups() | Trả về tất cả nhóm con dưới dạng tuple (nếu có). |
start() | Trả về vị trí bắt đầu của mẫu trong chuỗi. |
end() | Trả về vị trí kết thúc của mẫu trong chuỗi. |
- Ví dụ:
Giả sử trong một danh sách các dịch vụ lưu trữ, bạn có thể sử dụng re.match()
để kiểm tra xem một chuỗi có bắt đầu bằng từ “Hosting” hay không. Cách thực hiện như sau:
import re
service = "Hosting Vietnix cung cấp hiệu suất cao"
matchObj = re.match(r'Hosting', service)
if matchObj:
print(f"Chuỗi khớp từ vị trí {matchObj.start()} đến {matchObj.end()}")
print("Kết quả khớp:", matchObj.group())
else:
print("Không tìm thấy kết quả khớp.")
- Kết quả như sau:
Chuỗi khớp từ vị trí 0 đến 7
Kết quả khớp: Hosting
Hàm re.match()
hữu ích để kiểm tra xem một chuỗi có bắt đầu bằng một mẫu nhất định hay không. Nó thường được sử dụng trong xác thực dữ liệu hoặc phân loại nội dung.
Hàm re.search()
Hàm re.search()
trong Python dùng để tìm kiếm lần xuất hiện đầu tiên của một mẫu biểu thức chính quy trong chuỗi. Nếu tìm thấy, nó trả về một đối tượng match, ngược lại sẽ trả về None
.
- Cú pháp:
re.search(pattern, string, flags=0)
- Tham số:
Tham số | Mô tả |
---|---|
pattern | Biểu thức chính quy cần tìm kiếm. |
string | Chuỗi cần tìm mẫu biểu thức chính quy. |
flags | Các bộ sửa đổi (Flags) giúp thay đổi cách tìm kiếm. |
- Đối tượng Match:
Phương thức | Mô tả |
---|---|
group(num=0) | Trả về chuỗi khớp toàn bộ hoặc nhóm con cụ thể. |
groups() | Trả về tất cả các nhóm con dưới dạng tuple. |
- Ví dụ:
Giả sử bạn muốn tìm kiếm từ “Vietnix” trong một chuỗi mô tả dịch vụ hosting:
import re
content = "Vietnix cung cấp dịch vụ hosting chất lượng cao."
matchObj = re.search(r'Vietnix', content)
if matchObj:
print(f"Chuỗi khớp bắt đầu tại vị trí {matchObj.start()} và kết thúc tại {matchObj.end()}")
print("Nội dung khớp:", matchObj.group())
else:
print("Không tìm thấy kết quả.")
- Kết quả như sau:
Chuỗi khớp bắt đầu tại vị trí 0 và kết thúc tại 7
Nội dung khớp: Vietnix
re.search()
sẽ chỉ tìm lần xuất hiện đầu tiên của mẫu biểu thức trong chuỗi. Nếu cần tìm tất cả các lần xuất hiện, bạn có thể sử dụng re.findall()
.
Matching với Searching
Trong Python, khi sử dụng Regular Expression, có hai phương thức quan trọng để kiểm tra sự khớp của chuỗi:
re.match()
: Kiểm tra xem chuỗi có khớp với mẫu regex ngay từ đầu chuỗi hay không. Nếu không khớp, nó sẽ trả vềNone
.re.search()
: Tìm kiếm sự khớp ở bất kỳ vị trí nào trong chuỗi, không chỉ ở đầu chuỗi.
Giả sử, bạn muốn kiểm tra xem chuỗi mô tả dịch vụ có chứa từ “Vietnix” hay không:
import re
text = "Dịch vụ hosting của Vietnix được nhiều khách hàng tin dùng."
# Sử dụng match()
matchObj = re.match(r'Vietnix', text, re.I)
if matchObj:
print("match -->", matchObj.group())
else:
print("No match!!")
# Sử dụng search()
searchObj = re.search(r'Vietnix', text, re.I)
if searchObj:
print("search -->", searchObj.group())
else:
print("Nothing found!!")
- Kết quả như sau:
No match!!
search –> Vietnix
Ở đây, re.match()
không tìm thấy kết quả vì từ “Vietnix” không nằm ở đầu chuỗi, trong khi re.search()
có thể tìm ra từ này dù nó xuất hiện ở giữa chuỗi. Nếu bạn chỉ cần kiểm tra xem chuỗi có bắt đầu bằng một mẫu cụ thể hay không, hãy dùng re.match()
. Nếu bạn muốn tìm mẫu ở bất kỳ đâu trong chuỗi, re.search()
là lựa chọn phù hợp hơn.
Hàm re.findall()
Hàm re.findall()
trong Python được sử dụng để tìm tất cả các chuỗi con trong một chuỗi chính (string) khớp với một mẫu biểu thức chính quy (pattern). Kết quả trả về là một danh sách các chuỗi hoặc tuple (nếu pattern có nhóm). Hàm này quét chuỗi từ trái sang phải và trả về các kết quả theo thứ tự tìm thấy. Nếu có các khớp rỗng, chúng vẫn sẽ được bao gồm trong kết quả.
Cú pháp
re.findall(pattern, string, flags=0)
Các tham số
Tham số | Mô tả |
---|---|
pattern | Biểu thức chính quy cần tìm trong chuỗi. |
string | Chuỗi cần tìm kiếm. |
flags | Các tùy chọn (flags) có thể được sử dụng để thay đổi cách tìm kiếm. |
Ví dụ
Ví dụ sau đây tìm tất cả các từ có chứa chữ “host” trong một danh sách mô tả dịch vụ của Vietnix:
import re
text = "Vietnix cung cấp hosting, cloud hosting, managed hosting và VPS chất lượng cao."
matches = re.findall(r"\b\w*host\w*\b", text)
print(matches)
- Kết quả như sau:
[‘hosting’, ‘hosting’, ‘hosting’]
Hàm re.sub()
Hàm re.sub()
trong Python được sử dụng để thay thế tất cả các chuỗi khớp với biểu thức chính quy bằng một chuỗi khác. Nếu có tham số max
, hàm sẽ chỉ thay thế tối đa max
lần xuất hiện.
Cú pháp
re.sub(pattern, repl, string, max=0)
Trong đó:
pattern
: Biểu thức chính quy cần thay thế.repl
: Chuỗi thay thế.string
: Chuỗi gốc cần tìm và thay thế.max
: Số lần thay thế tối đa (mặc định là 0, nghĩa là thay thế tất cả).
Ví dụ 1: Loại bỏ comment trong chuỗi
Giả sử, bạn có một danh sách ghi chú về dịch vụ, trong đó chứa các comment không cần thiết. Bạn có thể sử dụng re.sub()
để loại bỏ phần comment này:
import re
info = "Vietnix cung cấp hosting # Nhà cung cấp dịch vụ uy tín"
clean_info = re.sub(r'#.*$', "", info)
print("Thông tin sau khi làm sạch:", clean_info.strip())
- Kết quả như sau:
Thông tin sau khi làm sạch: Vietnix cung cấp hosting
Trong ví dụ này, re.sub(r'#.*$', "", info)
loại bỏ mọi nội dung sau dấu #
. Cách này thường được sử dụng để làm sạch dữ liệu đầu vào.
Ví dụ 2: Loại bỏ tất cả ký tự không phải số
Khi xử lý thông tin liên hệ khách hàng, có thể cần lọc ra chỉ các chữ số từ một chuỗi số điện thoại:
import re
phone = "Hotline Vietnix: 18001093"
clean_phone = re.sub(r'\D', "", phone)
print("Số điện thoại hợp lệ:", clean_phone)
- Kết quả như sau:
Số điện thoại hợp lệ: 18001093
Hàm re.compile()
Hàm re.compile()
trong Python được sử dụng để biên dịch một mẫu biểu thức chính quy thành một đối tượng regex. Đối tượng này có thể tái sử dụng nhiều lần với các phương thức như match()
, search()
, findall()
, giúp cải thiện hiệu suất khi thực hiện nhiều thao tác khớp chuỗi.
Cú pháp
re.compile(pattern, flags=0)
Trong đó:
- pattern: Biểu thức chính quy cần biên dịch.
- flags (tùy chọn): Các tùy chỉnh giúp điều chỉnh cách hoạt động của regex
Flags
Modifier | Mô tả |
---|---|
re.I | Không phân biệt chữ hoa – chữ thường khi so khớp. |
re.L | Xác định từ ngữ dựa trên ngôn ngữ cục bộ. |
re.M | Ký tự ^ khớp với đầu mỗi dòng, $ khớp với cuối mỗi dòng thay vì chỉ đầu/cuối chuỗi. |
re.S | Dấu . sẽ khớp với mọi ký tự, bao gồm cả xuống dòng (\n ). |
re.U | Xác định ký tự theo bộ mã Unicode. |
re.X | Cho phép sử dụng cú pháp dễ đọc hơn, bỏ qua khoảng trắng và cho phép chú thích với # . |
Ví dụ
Giả sử, bạn có một danh sách các tên miền phổ biến và muốn tìm kiếm các tên miền có đuôi .vn
. Cách thực hiện như sau:
import re
domains = "vietnix.vn, example.com, hosting.vn, mywebsite.net"
pattern = re.compile(r'\w+\.vn')
matches = pattern.findall(domains)
print(matches)
- Kết quả như sau:
[‘vietnix.vn’, ‘hosting.vn’]
Hàm re.finditer()
Hàm re.finditer()
trong Python trả về một iterator chứa các match objects, đại diện cho tất cả các kết quả phù hợp với biểu thức chính quy trong chuỗi mà không bị chồng lấn. Điều này giúp duyệt qua từng kết quả một cách linh hoạt và hiệu quả.
Cú pháp
re.finditer(pattern, string, flags=0)
Trong đó:
pattern
: Biểu thức chính quy cần tìm.string
: Chuỗi cần kiểm tra.flags
: Tùy chọn, giúp điều chỉnh cách khớp mẫu.
Ví dụ
Giả sử, bạn muốn tìm tất cả các từ “Vietnix” xuất hiện trong một chuỗi mô tả dịch vụ lưu trữ:
import re
text = "Vietnix cung cấp hosting chất lượng. Dịch vụ của Vietnix được nhiều người tin dùng."
pattern = re.compile(r'Vietnix')
matches = pattern.finditer(text)
for match in matches:
print(match.span()) # Hiển thị vị trí xuất hiện của từ "Vietnix"
- Kết quả như sau:
(0, 7)
(40, 47)
Hàm re.finditer()
rất hữu ích khi cần duyệt qua từng kết quả khớp trong chuỗi. Nó cho phép xử lý chi tiết, chẳng hạn như đánh dấu vị trí trong văn bản hoặc trích xuất thông tin liên quan.
Các trường hợp sử dụng của Python Regex
Regular Expression trong Python có nhiều ứng dụng thực tế giúp xử lý và phân tích dữ liệu nhanh chóng. Hàm findall()
giúp tìm tất cả các kết quả khớp với một mẫu regex, thay vì chỉ trả về kết quả đầu tiên như search()
. Điều này rất hữu ích trong việc trích xuất thông tin từ nội dung văn bản.
Tìm tất cả các trạng từ trong một đoạn mô tả
Ví dụ, nếu cần tìm tất cả các trạng từ trong một đoạn mô tả dịch vụ, bạn có thể sử dụng findall()
như sau:
import re
text = "Vietnix cam kết cung cấp dịch vụ ổn định, hỗ trợ nhanh chóng và bảo mật tuyệt đối."
adverbs = re.findall(r"\w+ly\b", text)
print(adverbs)
- Kết quả như sau:
[‘nhanh chóng’, ‘tuyệt đối’]
Trong thực tế, kỹ thuật này có thể được dùng để phân tích nội dung đánh giá dịch vụ và trích xuất các cụm từ thể hiện mức độ hoặc cảm xúc của khách hàng. Điều này giúp tối ưu hóa nội dung marketing hoặc cải thiện chatbot hỗ trợ tự động.
Tìm từ bắt đầu bằng nguyên âm
Trong Regular Expression, bạn có thể sử dụng regex để tìm các từ bắt đầu bằng nguyên âm (a, e, i, o, u). Điều này hữu ích trong nhiều trường hợp, chẳng hạn như lọc dữ liệu hoặc kiểm tra định dạng văn bản.
Giả sử, bạn cần tìm các từ bắt đầu bằng nguyên âm trong một đoạn văn bản, bạn có thể sử dụng regex như sau:
import re
text = 'Uptime của máy chủ luôn được đảm bảo. Email hỗ trợ của Vietnix hoạt động 24/7.'
obj = re.findall(r'\b[aeiouAEIOU]\w+', text)
print(obj)
- Kết quả như sau:
[‘Uptime’, ‘Email’]
Trong ví dụ trên, regex \b[aeiouAEIOU]\w+
giúp xác định các từ có chữ cái đầu tiên là nguyên âm. Đây là một cách hữu ích để trích xuất thông tin có điều kiện từ văn bản một cách tự động và chính xác.
Bộ sửa đổi Regular Expression: Flags tùy chọn
Trong Python, các biểu thức chính quy (Regular Expression) có thể đi kèm với các bộ sửa đổi (flags) để kiểm soát cách thức so khớp dữ liệu. Các flags này được chỉ định bằng toán tử OR (|
) nếu sử dụng nhiều flag cùng lúc. Dưới đây là danh sách các flags phổ biến trong Python:
Flag | Mô tả |
---|---|
re.I | So khớp không phân biệt chữ hoa, chữ thường. Ví dụ, "vietnix" có thể khớp với "Vietnix" , "VIETNIX" , v.v. |
re.L | Xác định từ theo ngôn ngữ cục bộ, ảnh hưởng đến nhóm ký tự \w , \W và ranh giới từ \b , \B . |
re.M | Giúp ký tự ^ khớp với đầu mỗi dòng và $ khớp với cuối mỗi dòng, thay vì chỉ đầu và cuối chuỗi. |
re.S | Làm cho dấu . khớp với mọi ký tự, bao gồm cả dấu xuống dòng \n . |
re.U | Xác định chữ cái theo bộ ký tự Unicode, ảnh hưởng đến \w , \W , \b , \B . |
re.X | Cho phép viết biểu thức chính quy rõ ràng hơn bằng cách bỏ qua khoảng trắng và sử dụng # để thêm chú thích. |
Regular Expression Patterns – Mẫu biểu thức chính quy
Trong Python, biểu thức chính quy (Regular Expression) sử dụng các ký tự và quy tắc đặc biệt để tìm kiếm, khớp mẫu và xử lý chuỗi. Ngoại trừ các ký tự điều khiển (+ ? . * ^ $ ( ) [ ] { } | \
), tất cả các ký tự khác sẽ khớp với chính nó. Nếu cần sử dụng một ký tự điều khiển dưới dạng văn bản thông thường, bạn có thể thêm dấu \
phía trước để thoát ký tự đó.
Dưới đây là bảng tổng hợp các mẫu biểu thức chính quy trong Python:
STT | Mẫu | Mô tả |
---|---|---|
1 | ^ | Khớp với đầu dòng. |
2 | $ | Khớp với cuối dòng. |
3 | . | Khớp với bất kỳ ký tự nào, ngoại trừ ký tự xuống dòng (\n ). Khi sử dụng tùy chọn m , nó cũng khớp với \n . |
4 | [...] | Khớp với bất kỳ ký tự nào trong dấu ngoặc vuông. |
5 | [^...] | Khớp với bất kỳ ký tự nào không nằm trong dấu ngoặc vuông. |
6 | re* | Khớp với 0 hoặc nhiều lần xuất hiện của biểu thức đứng trước. |
7 | re+ | Khớp với ít nhất 1 lần xuất hiện của biểu thức đứng trước. |
8 | re? | Khớp với 0 hoặc 1 lần xuất hiện của biểu thức đứng trước. |
9 | re{n} | Khớp chính xác n lần xuất hiện của biểu thức đứng trước. |
10 | re{n,} | Khớp ít nhất n lần xuất hiện của biểu thức đứng trước. |
11 | re{n,m} | Khớp từ n đến m lần xuất hiện của biểu thức đứng trước. |
12 | `a | b` |
13 | (re) | Nhóm biểu thức chính quy và ghi nhớ phần khớp. |
14 | (?imx) | Bật tùy chọn i , m , x trong phạm vi toàn bộ regex hoặc trong dấu ngoặc đơn. |
15 | (?-imx) | Tắt tùy chọn i , m , x trong phạm vi toàn bộ regex hoặc trong dấu ngoặc đơn. |
16 | (?:re) | Nhóm biểu thức chính quy mà không ghi nhớ phần khớp. |
17 | (?imx:re) | Bật tùy chọn i , m , x trong phạm vi dấu ngoặc đơn. |
18 | (?-imx:re) | Tắt tùy chọn i , m , x trong phạm vi dấu ngoặc đơn. |
19 | (?#...) | Thêm chú thích vào regex. |
20 | (?=re) | Xác định vị trí khớp mà không tiêu thụ ký tự (lookahead assertion). |
21 | (?!re) | Xác định vị trí khớp nếu biểu thức phía sau không khớp (negative lookahead). |
22 | (?>re) | Khớp với biểu thức độc lập mà không backtracking. |
23 | \w | Khớp với ký tự chữ cái, chữ số và dấu gạch dưới ([a-zA-Z0-9_] ). |
24 | \W | Khớp với ký tự không phải chữ cái, chữ số và dấu gạch dưới. |
25 | \s | Khớp với khoảng trắng ([\t\n\r\f] ). |
26 | \S | Khớp với ký tự không phải khoảng trắng. |
27 | \d | Khớp với chữ số ([0-9] ). |
28 | \D | Khớp với ký tự không phải chữ số. |
29 | \A | Khớp với đầu chuỗi. |
30 | \Z | Khớp với cuối chuỗi, nếu có xuống dòng thì khớp ngay trước xuống dòng. |
31 | \z | Khớp với cuối chuỗi. |
32 | \G | Khớp với vị trí kết thúc lần khớp trước đó. |
33 | \b | Khớp với ranh giới từ (word boundary). Nếu trong dấu ngoặc vuông thì khớp với ký tự backspace (0x08 ). |
34 | \B | Khớp với vị trí không phải ranh giới từ. |
35 | \n, \t, ... | Khớp với ký tự xuống dòng, tab, và các ký tự đặc biệt khác. |
36 | \1...\9 | Khớp với nhóm con thứ n đã khớp trước đó. |
37 | \10 | Khớp với nhóm con thứ n nếu đã khớp, nếu không thì hiểu là mã ký tự bát phân. |
Giả sử, bạn muốn tìm tất cả các địa chỉ email có đuôi .vn
trong danh sách khách hàng của Vietnix, bạn có thể sử dụng regex sau:
import re
text = """
khachhang1@gmail.com
khachhang2@yahoo.vn
khachhang3@vietnix.vn
support@vietnix.com
"""
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.vn\b'
matches = re.findall(pattern, text)
print(matches)
- Kết quả như sau:
[‘khachhang2@yahoo.vn’, ‘khachhang3@vietnix.vn’]
Câu lệnh trên giúp trích xuất tất cả các email có đuôi .vn
, giúp ích cho việc lọc danh sách khách hàng theo khu vực. Regular Expression là một công cụ mạnh mẽ trong Python, đặc biệt hữu ích khi làm việc với dữ liệu chuỗi. Khi áp dụng đúng cách, nó có thể giúp tối ưu hóa việc xử lý dữ liệu một cách hiệu quả.
Character classes
Character classes trong Regular Expression giúp xác định một tập hợp ký tự cụ thể để khớp trong chuỗi. Character classes thường được sử dụng trong các tình huống cần lọc dữ liệu đầu vào hoặc kiểm tra định dạng chuỗi, chẳng hạn như kiểm tra tên miền hợp lệ hoặc lọc các ký tự đặc biệt trong biểu mẫu. Dưới đây là một số character classes phổ biến:
STT | Ví dụ | Mô tả |
---|---|---|
1 | [Pp]ython | Khớp với “Python” hoặc “python” |
2 | rub[ye] | Khớp với “ruby” hoặc “rube” |
3 | [aeiou] | Khớp với bất kỳ nguyên âm thường nào (a, e, i, o, u) |
4 | [0-9] | Khớp với bất kỳ chữ số nào từ 0 đến 9 |
5 | [a-z] | Khớp với bất kỳ chữ cái thường nào từ a đến z |
6 | [A-Z] | Khớp với bất kỳ chữ cái in hoa nào từ A đến Z |
7 | [a-zA-Z0-9] | Khớp với bất kỳ chữ cái hoặc chữ số nào |
8 | [^aeiou] | Khớp với bất kỳ ký tự nào không phải nguyên âm thường |
9 | [^0-9] | Khớp với bất kỳ ký tự nào không phải chữ số |
Character Classes đặc biệt
Trong Regular Expression, Character Classes đặc biệt giúp xác định nhóm ký tự cụ thể trong chuỗi. Qua đó, nó giúp bạn xử lý dữ liệu hiệu quả hơn trong các tác vụ như lọc dữ liệu khách hàng, kiểm tra mã đơn hàng hay xử lý nội dung trên hệ thống. Dưới đây là các Character Classes phổ biến và cách sử dụng chúng:
STT | Ký tự | Mô tả | Ví dụ |
---|---|---|---|
1 | . | Khớp với bất kỳ ký tự nào (trừ xuống dòng). | Vietnix. → Khớp Vietnix1 , VietnixA |
2 | \d | Khớp với chữ số [0-9] . | Order123 → Khớp 123 |
3 | \D | Khớp với ký tự không phải số [^0-9] . | VPS99 → Khớp VPS |
4 | \s | Khớp với khoảng trắng (space, tab, xuống dòng). | Hosting Vietnix → Khớp khoảng trắng |
5 | \S | Khớp với ký tự không phải khoảng trắng. | Cloud Server → Khớp Cloud , Server |
6 | \w | Khớp với ký tự từ [A-Za-z0-9_] . | Vietnix_01 → Khớp toàn bộ |
7 | \W | Khớp với ký tự không thuộc từ [^A-Za-z0-9_] . | Plan#1 → Khớp # |
Các trường hợp lặp lại
Trong Regular Expression, các ký tự lặp lại cho phép xác định số lần xuất hiện của một ký tự hoặc nhóm ký tự trong chuỗi. Dưới đây là các trường hợp lặp lại phổ biến:
STT | Biểu thức | Mô tả |
---|---|---|
1 | ruby? | Khớp với "rub" hoặc "ruby" , trong đó ký tự y là tùy chọn. |
2 | ruby* | Khớp với "rub" và bất kỳ số lượng ký tự y nào (bao gồm cả 0). |
3 | ruby+ | Khớp với "rub" và ít nhất một ký tự y . |
4 | \d{3} | Khớp chính xác 3 chữ số. |
5 | \d{3,} | Khớp với 3 chữ số trở lên. |
6 | \d{3,5} | Khớp với 3, 4 hoặc 5 chữ số. |
Lặp ít nhất có thể – Nongreedy repetition
Trong Regular Expression, mặc định các toán tử lặp (*
, +
, {m,n}
) hoạt động theo cơ chế greedy, tức là chúng sẽ khớp nhiều nhất có thể. Tuy nhiên, nếu muốn khớp ít nhất có thể, bạn nên sử dụng thêm dấu ?
ngay sau toán tử lặp, tạo thành nongreedy repetition.
STT | Biểu thức | Mô tả | Ví dụ |
---|---|---|---|
1 | <.*> | Greedy repetition – Khớp nhiều nhất có thể | Với chuỗi "<Vietnix>Hosting>" , regex này sẽ khớp toàn bộ "<Vietnix>Hosting>" . |
2 | <.*?> | Nongreedy repetition – Khớp ít nhất có thể | Với cùng chuỗi "<Vietnix>Hosting>" , regex này chỉ khớp "<Vietnix>" . |
Nhóm với dấu ngoặc đơn
Trong Regular Expression, dấu ngoặc đơn ()
được sử dụng để nhóm các phần của biểu thức nhằm áp dụng các phép toán lặp hoặc để trích xuất dữ liệu cụ thể. Khi nhóm một phần biểu thức, toàn bộ nội dung bên trong ngoặc đơn sẽ được coi như một đơn vị duy nhất, giúp dễ dàng thao tác hơn. Dưới đây là một số ví dụ minh họa cách sử dụng nhóm trong regex:
STT | Ví dụ | Mô tả |
---|---|---|
1 | \D\d+ | Không có nhóm: Dấu + chỉ áp dụng cho \d , tức là lặp lại ký tự số |
2 | (\D\d)+ | Có nhóm: Dấu + áp dụng cho toàn bộ \D\d , nghĩa là cặp ký tự này sẽ lặp lại |
3 | ([Hh]osting(, )?)+ | Khớp với “Hosting”, “hosting, hosting”, “Hosting, hosting, hosting”, v.v. |
Tham chiếu ngược – Backreferences
Tham chiếu ngược (Backreferences) trong Regular Expression cho phép bạn khớp lại một nhóm con đã được tìm thấy trước đó trong cùng một mẫu regex. Điều này hữu ích khi cần xác định các phần tử trùng khớp trong chuỗi văn bản mà không cần viết lại mẫu nhiều lần.
Trong thực tế, Backreferences có thể được áp dụng để xác định các mẫu lặp lại trong dữ liệu, chẳng hạn kiểm tra các đoạn văn bản trùng lặp hoặc tìm các giá trị cần đồng bộ trong một chuỗi. Dưới đây là một số ví dụ về cách sử dụng Backreferences trong Python:
STT | Ví dụ | Mô tả |
---|---|---|
1 | ([Pp])ython&\1ails | Khớp với “python&pails” hoặc “Python&Pails”. Ở đây, \1 tham chiếu đến chữ cái “P” hoặc “p” đã khớp trước đó. |
2 | (['"])[^\1]*\1 | Khớp với một chuỗi nằm trong dấu nháy đơn hoặc nháy kép, chẳng hạn "Vietnix" hoặc 'Hosting' . \1 đảm bảo ký tự đóng giống với ký tự mở. |
Các lựa chọn thay thế
Dưới đây là một số lựa chọn thay thế có thể áp dụng trong các trường hợp khác nhau:
STT | Lựa chọn & Mô tả |
---|---|
1 | python|perl – Khớp với “python” hoặc “perl”. |
2 | rub(y|le) – Khớp với “ruby” hoặc “ruble”. |
3 | Python(!+|\?) – Khớp với “Python” khi theo sau bởi một hoặc nhiều dấu “!” hoặc một dấu “?”. |
Anchors
Anchors được sử dụng để xác định vị trí khớp của một chuỗi trong văn bản, giúp tìm kiếm chính xác hơn. Dưới đây là các loại anchors phổ biến:
STT | Mẫu & Mô tả |
---|---|
1 | ^Python – Khớp với “Python” nếu nó xuất hiện ở đầu chuỗi hoặc dòng. |
2 | Python$ – Khớp với “Python” nếu nó xuất hiện ở cuối chuỗi hoặc dòng. |
3 | \APython – Khớp với “Python” nếu nó xuất hiện ở đầu chuỗi. |
4 | Python\Z – Khớp với “Python” nếu nó xuất hiện ở cuối chuỗi. |
5 | \bPython\b – Khớp với “Python” khi nó là một từ độc lập. |
6 | \brub\B – \B là nonword boundary: khớp với “rub” trong “rube” và “ruby” nhưng không khớp nếu đứng một mình. |
7 | Python(?=!) – Khớp với “Python” nếu sau nó là dấu “!”. |
8 | Python(?! !) – Khớp với “Python” nếu sau nó không có dấu “!”. |
Cú pháp đặc biệt với dấu ngoặc đơn
Dưới đây là một số cú pháp đặc biệt với dấu ngoặc đơn giúp xử lý chuỗi hiệu quả hơn:
STT | Cú pháp & Mô tả |
---|---|
1 | R(?#comment) – Khớp với “R”, phần còn lại chỉ là chú thích và không ảnh hưởng đến kết quả tìm kiếm. |
2 | R(?i)uby – Khớp với “Ruby” không phân biệt chữ hoa chữ thường. |
3 | R(?i:uby) – Tương tự như trên, áp dụng không phân biệt chữ hoa chữ thường cho phần “uby”. |
4 | rub(?:y|le)) – Chỉ nhóm mà không tạo tham chiếu ngược \1. |
Vietnix – Nhà cung cấp dịch vụ lưu trữ chất lượng cao
Vietnix là một trong những đơn vị tiên phong trong lĩnh vực web hosting, VPS, thuê máy chủ và domain tại Việt Nam, cung cấp giải pháp lưu trữ với hiệu suất vượt trội và bảo mật tối đa. Hệ thống hạ tầng mạnh mẽ kết hợp với đội ngũ kỹ thuật hỗ trợ 24/7 giúp đảm bảo tốc độ truy cập nhanh, website hoạt động ổn định. Với hơn 80.000 khách hàng tin tưởng sử dụng, Vietnix không chỉ mang đến sự an tâm mà còn giúp tối ưu chi phí và hiệu suất cho doanh nghiệp. Liên hệ ngay để trải nghiệm dịch vụ chuyên nghiệp tại Vietnix!
Thông tin liên hệ:
- Hotline: 18001093
- Email: sales@vietnix.com.vn
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh.
- Website: https://vietnix.vn/
Câu hỏi thường gặp
Điều gì xảy ra khi một regex quá phức tạp? Có giới hạn nào về hiệu suất trong Python không?
Khi một regex quá phức tạp, nó có thể gây ra:
– Giảm hiệu suất: Regex phức tạp dẫn đến thời gian xử lý lâu hơn, đặc biệt khi có nhiều nhóm lồng nhau hoặc ký tự lặp (.*
, .+
) không kiểm soát.
– Hiện tượng backtracking quá mức: Các biểu thức không tối ưu có thể khiến regex thử nhiều tổ hợp khớp khác nhau, gây chậm hoặc treo chương trình.
– Tốn bộ nhớ: Xử lý regex lớn trên dữ liệu lớn có thể tiêu tốn tài nguyên đáng kể, ảnh hưởng đến hiệu suất tổng thể.
– Lỗi RecursionError: Python có giới hạn về độ sâu đệ quy khi backtracking, nếu vượt quá có thể gây lỗi.
– Không ổn định trên dữ liệu lớn: Một số regex chạy nhanh trên dữ liệu nhỏ nhưng chậm đáng kể khi mở rộng quy mô.
Cách tối ưu hóa hiệu suất khi sử dụng regex trong Python với dữ liệu lớn?
Để tối ưu hiệu suất regex trong Python với dữ liệu lớn:
– Dùng re.compile()
để biên dịch trước và tái sử dụng.
– Hạn chế nhóm không cần thiết để giảm chi phí xử lý.
– Ưu tiên re.finditer()
thay vì re.findall()
để tiết kiệm bộ nhớ.
– Tránh .*
hoặc .+
không kiểm soát để giảm backtracking.
– Giới hạn phạm vi tìm kiếm với ^
, $
, \A
, \Z
.
– Giữ regex đơn giản nhất có thể để tăng tốc độ xử lý.
– Xem xét sử dụng thư viện regex
thay cho re
nếu cần hiệu suất cao hơn.
Tại sao re.match()
trong Python chỉ kiểm tra từ đầu chuỗi thay vì kiểm tra toàn bộ?
re.match()
trong Python chỉ kiểm tra từ đầu chuỗi thay vì toàn bộ chuỗi do 2 lý do chính:
– Hiệu suất tối ưu: Việc chỉ kiểm tra phần đầu giúp tăng tốc độ xử lý, đặc biệt với chuỗi dài.
– Thiết kế logic: re.match()
phù hợp cho các trường hợp cần xác định xem chuỗi có bắt đầu bằng một mẫu nhất định hay không, như kiểm tra định dạng dữ liệu.
Nếu cần tìm mẫu xuất hiện ở bất kỳ đâu trong chuỗi, nên sử dụng re.search()
.
Lời kết
Regular Expression trong Python là một công cụ hữu ích để thao tác chuỗi nhanh chóng và chính xác. Việc nắm vững cách sử dụng Regex giúp tối ưu hóa mã nguồn, cải thiện hiệu suất xử lý dữ liệu. Tuy nhiên, cần viết biểu thức một cách tối ưu để tránh ảnh hưởng đến tốc độ và tài nguyên hệ thống. Nếu làm việc nhiều với dữ liệu văn bản, Regex là kỹ năng quan trọng mà bạn nên thành thạo. Cảm ơn bạn đã theo dõi bài viết!
Mọi người cũng xem: