1. Định nghĩa RegEx trong Python

RegEx viết tắt của từ “Regular Expression”  hay còn gọi là Biểu thức chính quy là một chuỗi các ký tự đặc biệt theo những khuôn mẫu (pattern) nhất định, đại diện cho chuỗi hoặc một tập các chuỗi.

Biểu thức chính quy thường được sử dụng để phát hiện sự hiện diện hoặc không có của một chuỗi thông qua cách so sánh chuỗi đó với một mẫu cụ thể. Biểu thức chính quy cũng có thể chia một mẫu thành một hoặc nhiều mẫu con khác.

Trong Python, có một gói tích hợp sẵn được gọi là re, có thể được sử dụng để làm việc với Biểu thức chính quy. Để sử dụng được mô-đun này ta cần nhập vào chương trình với câu lệnh sau:

import re

Khi bạn đã nhập mô-đun re, bạn có thể bắt đầu sử dụng biểu thức chính quy.

Một ví dụ đơn giản với mô-đun re, chúng ta sẽ sử dụng phương thức re.search() để kiểm tra chuỗi có bắt đầu bằng “Xin” và kết thúc bằng “dau” hay không:

import re
# Chuoi ban dau
txt = "Xin chao, toi la lap trinh tu dau"

# Kiem tra txt co bat dau bang "xin" va ket thuc bang "dau" hay khong
x = re.search("^Xin.*dau$", txt) # Ket qua la true hoac false

# Neu x la true
if x:
  print("Chuoi thoa man dieu kien")
else: # Truong hop x là false
  print("Chuoi khong thoa man dieu kien")

Kết quả:

Chuoi thoa man dieu kien
Ở trong phương thức re.search(MetaCharacter,txt) cần nhận vào hai tham số đầu vào đó là:
  • MetaCharacter là các ký tự đặc biệt, được sử dụng để làm khuân mẫu cho việc tìm kiếm và lọc ra kết quả từ chuỗi gốc
  • txt là chuỗi gốc cần được sử lý

Có rất nhiều MetaCharacter khác nhau để sử dụng ở các khuân mẫu khác nhau. Ví dụ ở trên chúng ta sử dụng MetaCharacter“^Xin.*dau$” để kiểm tra xem chuỗi gốc có bắt đầu bằng từ “Xin” và kết thúc bởi từ “dau” hay không?

2. Các MetaCharacters thường được sử dụng

Dưới đây là danh sách các siêu ký tự MetaCharacters thường được sử dụng trong việc làm khuân mẫu cho một biểu thức chính quy trong Python.

Bảng các MetaCharacters

MetaCharacters Mô tả Ví dụ
\ Được sử dụng để loại bỏ ký tự đặc biệt ngay sau nó “\d”
[] Đại diện một tập các ký tự “[a-z]”
^ Khớp với ký tự đầu chuỗi “^xin chao”
$ Khớp với ký tự cuối chuỗi “tam biet$”
. Khớp với bất kỳ ký tự nào ngoại trừ dòng mới “he..o”
| Có nghĩa là HOẶC (Đối sánh với bất kỳ ký tự nào được phân tách bởi nó. “java|javascript”
? Đối sánh không hoặc một lần xuất hiện “he.?o”
* Bất kỳ số lần xuất hiện nào (bao gồm 0 lần xuất hiện) “he.*o”
+ Một hoặc nhiều lần xuất hiện “he.+o”
{} Cho biết số lần xuất hiện của một regex trước để khớp. “he.{2}o”
() Kèm theo một nhóm Regex

Bảng các chuỗi ký tự đặc biệt

Chuỗi ký tự đặc biệt Mô tả
\A Trả về một kết quả khớp nếu các ký tự được chỉ định có mặt ở đầu chuỗi.
\b Trả về một kết quả khớp nếu các ký tự được chỉ định có mặt ở đầu hoặc cuối chuỗi.
\B Trả về một kết quả khớp nếu các ký tự được chỉ định có mặt ở đầu chuỗi nhưng không ở cuối chuỗi.
\d Trả về một kết quả khớp nếu chuỗi chứa các chữ số [0-9].
\D Trả về một kết quả khớp nếu chuỗi không chứa các chữ số [0-9].
\s Trả về một kết quả khớp nếu chuỗi chứa bất kỳ ký tự khoảng trắng nào.
\S Trả về một kết quả khớp nếu chuỗi không chứa bất kỳ ký tự khoảng trắng nào.
\w Trả về một kết quả khớp nếu chuỗi chứa bất kỳ ký tự từ nào.
\W Trả về một kết quả khớp nếu chuỗi không chứa bất kỳ từ nào.
\Z Trả về một kết quả khớp nếu các ký tự được chỉ định ở cuối chuỗi.

Bảng các tập hợp

Tập hợp Mô tả
[arn] Tập hợp các chuỗi được chỉ định trong tập hợp
[a-n] Tập hợp các ký tự trong khoảng từ a đến n
[^arn] Tập hợp các ký tự khác với các ký tự arn
[0123] Tập hợp các số được chỉ định trong tập hợp
[0-9] Tập hợp các số từ 1 đến 9
[0-5][0-9] Tập hợp các chữ số nào trong khoảng từ 00 đến 59.
[a-zA-Z] Tập hợp các ký tự trong  bảng chữ cái bao gồm cả chữ thường hoặc chữ hoa

3. Các phương thức trong RegEx

Mô-đun re cung cấp một tập hợp các hàm cho phép chúng ta xử lý một chuỗi đầu vào theo một quy tắc khuân mẫu chuẩn. Các hàm đó là:

  • re.findall() – Hàm trả về một danh sách chứa tất cả các kết quả khớp của một mẫu trong chuỗi.
  • re.search() – Hàm trả về đối tượng khớp nếu có một kết quả khớp được tìm thấy trong chuỗi.
  • re.split() – Hàm trả về một danh sách trong đó chuỗi đã được phân chia theo mỗi kết quả khớp.
  • re.sub() – Hàm thay thế một hoặc nhiều kết quả khớp trong chuỗi.

Hàm re.findall()

Hàm re.findall() được sử dụng để trả về một danh sách chứa tất cả các kết quả khớp của một mẫu trong chuỗi. Nếu không tìm thấy kết quả phù hợp nào, một LIST trống sẽ được trả về.

Ví dụ hiển thị danh sách tất cả các kết quả phù hợp:

import re

# Chuoi txt ban dau
txt = "Xin chao, toi la lap trinh tu dau!"

# Tra ve list cac ky tu "in" trong chuoi txt
x = re.findall("in", txt) # Ket qua la mot list

# Hien thi ket qua
print(x)
[‘in’, ‘in’]

Hàm re.search()

Hàm re.search() được sử dụng để tìm kiếm chuỗi để tìm một kết quả phù hợp và trả về một đối tượng Match nếu có một kết quả phù hợp. Nếu có nhiều hơn một Match, thì Match đầu tiên sẽ được trả về. Nếu không tìm thấy kết quả phù hợp nào, giá trị None sẽ được trả về:

Ví dụ tìm kiếm hoảng cách đầu tiên trong chuỗi:

import re

# Chuoi ky tu ban dau
txt = "Xin chao, toi la lap trinh tu dau"

# Lay ra khoang cach dau tien trong chuoi txt
x = re.search("\s", txt)

print("Ky tu khoang cach dau tien nam o vi tri: ", x.start()) 

Kết quả:

Ky tu khoang cach dau tien nam o vi tri: 3

Hàm re.split()

Hàm re.split() được sử dụng để trả về một LIST trong đó các phần tử là chuỗi đã được tách ra ở mỗi Match.

Ví dụ tách từng từ trong chuỗi dựa theo khoảng cách:

import re

# Chuoi ky tu ban dau
txt = "Xin chao, toi la lap trinh tu dau"

# Tach tung tu trong chuoi txt theo dau khoang cach
x = re.split("\s", txt)

# Hien thi ket qua la cac chuoi sau khi tach ra theo khoang cach
print(x)

Kết quả:

[‘Xin’, ‘chao,’, ‘toi’, ‘la’, ‘lap’, ‘trinh’, ‘tu’, ‘dau’]

Hàm re.sub()

Hàm re.sub() được sử dụng để thay thế các kết quả phù hợp bằng các chuỗi đã được chỉ định sẵn.

Ví dụ thay thế mọi ký tự khoảng trắng bằng số 7 trong chuỗi:

import re

# Chuoi ky tu ban dau
txt = "Xin chao, toi la lap trinh tu dau"

# Thay thế cac dau khoang cach trong chuoi txt bang so 7
x = re.sub("\s", "7", txt)

# Hien thi ket qua la chuoi duoc thay the
print(x)

Kết quả:

Xin7chao,7toi7la7lap7trinh7tu7dau