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

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

Bài viết này giải thích về biểu thức chính quy trong Python.

Chúng ta sẽ đề cập đến nhiều chủ đề, từ cách sử dụng cơ bản mô-đun re đến việc khớp mẫu biểu thức chính quy phức tạp.

YouTube Video

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

Mô-đun re được sử dụng để tìm kiếm và xử lý chuỗi bằng cách sử dụng biểu thức chính quy.

Mô-đun re là gì?

Mô-đun re được tích hợp trong thư viện chuẩn của Python và cung cấp các chức năng xử lý chuỗi bằng biểu thức chính quy. Biểu thức chính quy được sử dụng để tìm, trích xuất hoặc thay thế mẫu chuỗi cụ thể một cách hiệu quả.

Các mẫu biểu thức chính quy cơ bản

Biểu thức chính quy định nghĩa các mẫu bằng các ký tự đặc biệt. Dưới đây là một số mẫu cơ bản.

  • .: Bất kỳ ký tự đơn lẻ nào
  • ^: Bắt đầu của một chuỗi
  • $: Kết thúc của một chuỗi
  • \d: Bất kỳ chữ số nào (0-9)
  • \w: Bất kỳ ký tự từ nào (a-z, A-Z, 0-9, _)
  • \s: Bất kỳ ký tự khoảng trắng nào
  • *: Không hoặc nhiều lần lặp lại
  • +: Một hoặc nhiều lần lặp lại
  • []: Nhóm ký tự (ví dụ, [a-z] khớp với các chữ cái thường)
 1import re
 2
 3pattern = r"\d{3}-\d{4}"
 4text = "My postal code is 123-4567."
 5result = re.search(pattern, text)
 6if result:
 7    print(result.group())  # Output: 123-4567
 8
 9# Define a pattern using basic regular expression symbols
10pattern = r"^\w+\s\d+\s[a-zA-Z]+$"
11
12# Example text to test the pattern
13text = "Room 23 Tokyo"
14
15# Check if the pattern matches the text
16result = re.match(pattern, text)
17if result:
18    print("Matched:", result.group())
19else:
20    print("No match")
  • Đoạn mã này trước hết kiểm tra xem chuỗi có khớp với mẫu mã bưu chính hay không. Tiếp theo, nó kiểm tra liệu toàn bộ chuỗi (từ đầu đến cuối) có khớp với một mẫu gồm một từ, khoảng trắng, chữ số, khoảng trắng và một từ tiếng Anh hay không. Điều này giúp bạn hiểu cách kết hợp các thành phần cơ bản của biểu thức chính quy.

Cách sử dụng các hàm khớp mẫu

re.match()

re.match() kiểm tra xem phần đầu của chuỗi có khớp với mẫu được chỉ định hay không.

1import re
2
3pattern = r"\w+"
4text = "Python is powerful"
5match = re.match(pattern, text)
6if match:
7    print(match.group())  # Output: Python
  • Đoạn mã này kiểm tra xem chuỗi có bắt đầu bằng một ký tự từ (chữ và số hoặc dấu gạch dưới) hay không. Từ đầu tiên 'Python' khớp với mẫu và được xuất ra.

re.search()

re.search() quét toàn bộ chuỗi và trả về kết quả khớp đầu tiên.

1import re
2
3pattern = r"powerful"
4text = "Python is powerful and versatile"
5search = re.search(pattern, text)
6if search:
7    print(search.group())  # Output: powerful
  • Đoạn mã này tìm trong toàn bộ chuỗi từ 'powerful' và trả về kết quả khớp đầu tiên. Kết quả là re.search() trả về chuỗi khớp 'powerful'.

re.findall()

re.findall() trả về tất cả các kết quả khớp với mẫu dưới dạng danh sách.

1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.findall(pattern, text)
6print(matches)  # Output: ['Python', 'strong']
  • Đoạn mã này tìm tất cả các từ có đúng sáu ký tự và trả về chúng dưới dạng một danh sách. 'Python' trong chuỗi thỏa điều kiện, và danh sách ['Python'] được xuất ra.

re.finditer()

re.finditer() trả về tất cả các kết quả khớp dưới dạng một iterator, cho phép bạn truy xuất thông tin chi tiết về từng kết quả khớp.

1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.finditer(pattern, text)
6for match in matches:
7    print(match.group())  # Output: Python
  • Đoạn mã này lần lượt tìm tất cả các từ dài sáu ký tự và xử lý từng kết quả khớp thông qua một iterator. 'Python' khớp với mẫu ở đây và được xuất ra.

Thay thế và Tách chuỗi

re.sub()

re.sub() thay thế các phần của chuỗi khớp với biểu thức chính quy bằng chuỗi khác.

1import re
2
3pattern = r"\d+"
4text = "There are 100 apples"
5new_text = re.sub(pattern, "many", text)
6print(new_text)  # Output: There are many apples
  • Đoạn mã này thay thế tất cả các chữ số trong chuỗi bằng 'many'.

re.split()

re.split() tách chuỗi tại các phần khớp với biểu thức chính quy.

1import re
2
3pattern = r"\s+"
4text = "Python is powerful"
5parts = re.split(pattern, text)
6print(parts)  # Output: ['Python', 'is', 'powerful']
  • Đoạn mã này tách chuỗi theo một hoặc nhiều ký tự khoảng trắng. Kết quả là chuỗi được tách thành các từ, tạo ra ['Python', 'is', 'powerful'].

Nhóm và Bắt giữ

Sử dụng nhóm biểu thức chính quy giúp dễ dàng trích xuất các chuỗi con khớp. Đặt trong dấu ngoặc đơn () sẽ bắt giữ nó như một nhóm.

1import re
2
3pattern = r"(\d{3})-(\d{4})"
4text = "My postal code is 123-4567."
5match = re.search(pattern, text)
6if match:
7    print(match.group(1))  # Output: 123
8    print(match.group(2))  # Output: 4567
  • Đoạn mã này trích xuất các số 3 chữ số và 4 chữ số thành các nhóm riêng biệt từ một mã bưu chính dạng '123-4567'. group(1) trả về ba chữ số đầu tiên '123', và group(2) trả về bốn chữ số cuối '4567'.

Nhóm có tên

Sử dụng nhóm có tên cho phép bạn truy xuất giá trị bằng các tên có ý nghĩa thay vì dựa vào chỉ số. Dưới đây là một ví dụ cụ thể trích xuất ngày và mức từ một log.

1import re
2
3log = "2025-10-25 14:00:01 [ERROR] Something failed"
4
5pattern = r"(?P<date>\d{4}-\d{2}-\d{2}) (?P<time>\d{2}:\d{2}:\d{2}) \[(?P<level>[A-Z]+)\] (?P<msg>.*)"
6m = re.search(pattern, log)
7if m:
8    print(m.group("date"), m.group("time"), m.group("level"))
9    print("message:", m.group("msg"))
  • Đoạn mã này sử dụng các nhóm có tên để trích xuất ngày, giờ, mức và thông điệp từ một chuỗi log. Nó truy xuất các giá trị bằng các tên có ý nghĩa thay vì bằng chỉ số.

Sử dụng Tùy chọn Cờ

Mô-đun re có một số tùy chọn cờ để điều khiển hành vi tìm kiếm.

  • re.IGNORECASE (re.I): Một tùy chọn cờ giúp so khớp không phân biệt chữ hoa chữ thường.
  • re.MULTILINE (re.M): Một tùy chọn cờ cho phép so khớp trên nhiều dòng.
  • re.DOTALL (re.S): Một tùy chọn cờ cho phép ký tự chấm . cũng khớp với ký tự xuống dòng.
1import re
2
3pattern = r"python"
4text = "Python is powerful"
5match = re.search(pattern, text, re.IGNORECASE)
6if match:
7    print(match.group())  # Output: Python
  • Đoạn mã này tìm từ 'python' mà không phân biệt chữ hoa/thường. Bằng cách dùng cờ re.IGNORECASE, nó cũng khớp với 'Python'.

Ưu điểm của đối tượng biểu thức chính quy (re.compile)

Biên dịch mẫu với re.compile giúp tái sử dụng hiệu quả hơn và cải thiện khả năng đọc. Bạn cũng có thể đặt các cờ tại đây.

Ví dụ sau lặp lại việc tìm kiếm các kết quả khớp trên nhiều dòng bằng một mẫu đã biên dịch. Nếu bạn thường xuyên dùng cùng một mẫu, biên dịch nó bằng re.compile sẽ cải thiện hiệu năng.

1import re
2
3pattern = re.compile(r"User: (\w+), ID: (\d+)")
4text = "User: alice, ID: 1\nUser: bob, ID: 2"
5
6for m in pattern.finditer(text):
7    print(m.groups())
  • Đoạn mã này dùng một biểu thức chính quy đã biên dịch để trích xuất tên người dùng và ID từ nhiều dòng. re.compile cải thiện hiệu quả khi tái sử dụng cùng một mẫu và cũng làm mã dễ đọc hơn.

Ứng dụng

Ví dụ, hãy xem xét một tập lệnh trích xuất tất cả các địa chỉ email từ một tệp văn bản.

1import re
2
3pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
4text = "Contact us at info@example.com or support@service.com."
5emails = re.findall(pattern, text)
6print(emails)  # Output: ['info@example.com', 'support@service.com']
  • Đoạn mã này tìm tất cả các địa chỉ email trong chuỗi và trích xuất chúng thành một danh sách.

Kết luận

Mô-đun re là một công cụ mạnh mẽ để xử lý chuỗi trong Python. Tại đây, chúng ta đã đề cập từ cách sử dụng cơ bản đến các biểu thức chính quy nâng cao bằng cách sử dụng nhóm và các tùy chọn cờ. Biểu thức chính quy của Python rất mạnh mẽ và là một công cụ không thể thiếu để xử lý văn bản.

Bạn có thể làm theo bài viết trên bằng cách sử dụng Visual Studio Code trên kênh YouTube của chúng tôi. Vui lòng ghé thăm kênh YouTube.

YouTube Video