Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Pattern Matching trong Python với Regex

Regular Expression (Biểu thức chính quy) là gì?

Trong thực tế, phân tích chuỗi (string parsing) trong hầu hết ngôn ngữ lập trình được xử lý bằng regular expression. Regular expression trong Python là phương pháp dùng để khớp mẫu văn bản.

Module re (có sẵn trong mọi cài đặt Python) cung cấp hỗ trợ regular expression.

Trong Python, tìm kiếm regular expression thường viết như sau:

match = re.search(pattern, string)

re.search() nhận hai đối số: một pattern regex và một chuỗi, tìm pattern đó trong chuỗi. Nếu tìm thấy, trả về match object, ngược lại trả về None. Regex có thể dùng để trả lời các câu hỏi như:

  • Chuỗi này có phải URL hợp lệ không?
  • User nào trong /etc/passwd thuộc nhóm đã cho?
  • Ngày giờ của tất cả cảnh báo trong file log?
  • Username và tài liệu nào được yêu cầu qua URL?

Khớp mẫu (Matching patterns)

Regular expression là một mini-language phức tạp. Chúng dựa trên các ký tự đặc biệt để khớp chuỗi chưa biết, nhưng bắt đầu với các ký tự chữ (chữ cái, số, khoảng trắng) - luôn khớp với chính chúng. Ví dụ cơ bản:

import re
search_string = "TutorialsPoint"
pattern = "Tutorials"
match = re.match(pattern, search_string)
if match:
    print("regex matches: ", match.group())
else:
    print('pattern not found')
regex matches: Tutorials

Khớp chuỗi (Matching a string)

Module re có nhiều phương thức. Để kiểm tra xem regex có khớp với chuỗi cụ thể không, dùng re.search(). re.MatchObject cung cấp thêm thông tin như phần nào của chuỗi khớp.

Cú pháp

matchObject = re.search(pattern, input_string, flags=0)

Ví dụ

import re
# Dùng regex khớp chuỗi ngày tháng
regex = r"([a-zA-Z]+) (\d+)"
if re.search(regex, "Jan 2"):
    match = re.search(regex, "Jan 2")
    print("Match at index %s, %s" % (match.start(), match.end()))
    print("Full match: %s" % (match.group(0)))
    print("Month: %s" % (match.group(1)))
    print("Day: %s" % (match.group(2)))
else:
    print("Pattern not Found!")
Match at index 0, 5
Full match: Jan 2
Month: Jan
Day: 2

Phương thức này dừng sau khớp đầu tiên, phù hợp để test regex hơn là trích xuất dữ liệu.

Capturing Groups (Nhóm bắt)

Nếu pattern có hai hoặc nhiều cặp ngoặc đơn, kết quả sẽ là tuple thay vì list chuỗi. Mỗi pattern khớp được biểu diễn bằng một tuple chứa group(1), group(2)...

import re
regex = r'([\w\.-]+)@([\w\.-]+)'
str = ('hello john@hotmail.com, hello@Tutorialspoint.com, hello python@gmail.com')
matches = re.findall(regex, str)
print(matches)
for tuple in matches:
    print("Username: ", tuple[0])
    print("Host: ", tuple[1])
[('john', 'hotmail.com'), ('hello', 'Tutorialspoint.com'), ('python', 'gmail.com')]
Username: john Host: hotmail.com
Username: hello Host: Tutorialspoint.com
Username: python Host: gmail.com

Tìm và thay thế chuỗi

Nhiệm vụ thường gặp: tìm tất cả các instance của pattern trong chuỗi và thay thế. re.sub(pattern, replacement, string) làm chính xác điều đó. Ví dụ: thay thế tất cả domain email cũ.

import re
str = ('hello john@hotmail.com, hello@Tutorialspoint.com, hello python@gmail.com, Hello World!')
pattern = r'([\w\.-]+)@([\w\.-]+)'
replace = r'\1@XYZ.com'
print(re.sub(pattern, replace, str))
hello john@XYZ.com, hello@XYZ.com, hello python@XYZ.com, Hello World!

Các flag tùy chọn (Re options flags)

Có thể dùng các flag để sửa đổi hành vi khớp pattern. Flag tùy chọn thêm vào search(), findall()... Ví dụ: re.search(pattern, string, re.IGNORECASE).

  • IGNORECASE: Không phân biệt chữ hoa/thường.
  • DOTALL: Cho phép dấu chấm (.) khớp với mọi ký tự kể cả newline (\n).
  • MULTILINE: Cho phép ^ và $ khớp với đầu/cuối mỗi dòng, thay vì cả chuỗi.