Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Biểu thức chính quy (Regex) trong Python
Biểu thức chính quy (regex) là một công cụ mạnh mẽ và linh hoạt được sử dụng rộng rãi trong lập trình để xác định và xử lý các mẫu chuỗi phức tạp. Trong nhiều ứng dụng thực tế, từ các công cụ tìm kiếm cho đến các hộp thoại tìm và thay thế của các trình soạn thảo văn bản, biểu thức chính quy đóng vai trò quan trọng trong việc xử lý văn bản. Python, một ngôn ngữ lập trình phổ biến, cung cấp một module tích hợp sẵn tên là re
để hỗ trợ làm việc với biểu thức chính quy. Trong bài viết này, mình sẽ tìm hiểu cách sử dụng biểu thức chính quy trong Python, từ các mẫu đơn giản đến phức tạp, và cách áp dụng chúng để giải quyết các vấn đề thực tiễn. Bạn sẽ được tìm hiểu về các hàm phổ biến trong module re
và cách sử dụng chúng một cách hiệu quả để tối ưu hóa mã của bạn. Hãy cùng bắt đầu hành trình tìm hiểu biểu thức chính quy trong Python để làm cho việc xử lý văn bản trở nên dễ dàng và hiệu quả hơn.
Giới thiệu về biểu thức chính quy trong Python
Biểu thức chính quy (regex hoặc regexp) là các mẫu tìm kiếm. Các ví dụ điển hình của biểu thức chính quy bao gồm các mẫu để khớp với địa chỉ email, số điện thoại, và số thẻ tín dụng.
Biểu thức chính quy thực chất là một ngôn ngữ lập trình chuyên biệt được nhúng trong Python. Bạn có thể tương tác với biểu thức chính quy thông qua module re
tích hợp sẵn trong Python.
Ví dụ về một biểu thức chính quy đơn giản
'\d'
Trong ví dụ này, biểu thức chính quy là một chuỗi chứa mẫu tìm kiếm. '\d'
là một tập ký tự số khớp với bất kỳ chữ số nào từ 0 đến 9.
Bài viết này được đăng tại [free tuts .net]
Lưu ý rằng bạn sẽ học cách xây dựng các mẫu phức tạp và nâng cao hơn trong các hướng dẫn tiếp theo. Hướng dẫn này tập trung vào các hàm xử lý biểu thức chính quy.
Sử dụng biểu thức chính quy trong Python
Để sử dụng biểu thức chính quy, bạn làm theo các bước sau:
Import module re
:
import re
Biên dịch biểu thức chính quy thành đối tượng Pattern:
p = re.compile('\d')
Sử dụng một trong các phương thức của đối tượng Pattern để khớp với chuỗi:
s = "Python 3.10 was released on October 04, 2021" result = p.findall(s) print(result)
Kết quả:
['3', '1', '0', '0', '4', '2', '0', '2', '1']
Phương thức findall()
trả về một danh sách các chữ số đơn lẻ trong chuỗi s
.
import re p = re.compile('\d') s = "Python 3.10 was released on October 04, 2021" results = p.findall(s) print(results)
Bên cạnh phương thức findall()
, đối tượng Pattern còn có các phương thức quan trọng khác cho phép bạn khớp với một chuỗi:
Phương thức | Mục đích |
---|---|
match() |
Tìm mẫu ở đầu chuỗi |
search() |
Trả về match đầu tiên của mẫu trong chuỗi |
findall() |
Trả về tất cả các match của mẫu trong chuỗi |
finditer() |
Trả về tất cả các match của mẫu dưới dạng iterator |
Các hàm biểu thức chính quy trong Python
Ngoài lớp Pattern, module re
còn có một số hàm để khớp một chuỗi với một mẫu:
match()
search()
findall()
finditer()
Các hàm này có tên giống như các phương thức của đối tượng Pattern và cũng nhận các đối số tương tự. Tuy nhiên, bạn không cần phải biên dịch biểu thức chính quy trước khi sử dụng chúng.
Ví dụ sau đây cho thấy chương trình tương tự sử dụng hàm findall()
thay vì phương thức findall()
của đối tượng Pattern:
import re s = "Python 3.10 was released on October 04, 2021." results = re.findall('\d', s) print(results)
Sử dụng các hàm trong module re
gọn gàng hơn so với các phương thức của đối tượng Pattern vì bạn không phải biên dịch biểu thức chính quy thủ công.
Hàm search()
Hàm search()
tìm kiếm một mẫu trong một chuỗi. Nếu có một match, nó trả về đối tượng Match đầu tiên hoặc None
nếu không tìm thấy. Ví dụ:
import re s = "Python 3.10 was released on October 04, 2021." pattern = '\d{2}' match = re.search(pattern, s) print(type(match)) print(match)
Kết quả:
<class 're.Match'> <re.Match object; span=(9, 11), match='10'>
Trong ví dụ này, hàm search()
trả về hai chữ số đầu tiên trong chuỗi s
dưới dạng đối tượng Match.
Đối tượng Match
Đối tượng Match cung cấp thông tin về chuỗi đã khớp. Nó có các phương thức quan trọng sau:
Phương thức | Mô tả |
---|---|
group() |
Trả về chuỗi đã khớp |
start() |
Trả về vị trí bắt đầu của match |
end() |
Trả về vị trí kết thúc của match |
span() |
Trả về một tuple (start, end) chỉ định vị trí của match |
Ví dụ sau đây kiểm tra đối tượng Match:
import re s = "Python 3.10 was released on October 04, 2021." result = re.search('\d', s) print('Matched string:', result.group()) print('Starting position:', result.start()) print('Ending position:', result.end()) print('Positions:', result.span())
Kết quả:
Matched string: 3 Starting position: 7 Ending position: 8 Positions: (7, 8)
Hàm match()
Hàm match()
trả về đối tượng Match nếu nó tìm thấy mẫu ở đầu chuỗi. Ví dụ:
import re l = ['Python', 'CPython is an implementation of Python written in C', 'Jython is a Java implementation of Python', 'IronPython is Python on .NET framework'] pattern = '\wython' for s in l: result = re.match(pattern, s) print(result)
Kết quả:
<re.Match object; span=(0, 6), match='Python'> None <re.Match object; span=(0, 6), match='Jython'> None
Trong ví dụ này, \w
là tập ký tự từ khớp với bất kỳ ký tự nào.
'\wython'
khớp với bất kỳ chuỗi nào bắt đầu bằng một ký tự từ duy nhất và theo sau là chuỗi ký tự ython, ví dụ: Python.
Chuỗi sau khớp với mẫu:
Python Jython is a Java implementation of Python
Và chuỗi sau không khớp:
CPython is an implementation of Python written in C IronPython is Python on .NET framework
Hàm fullmatch()
Hàm fullmatch()
trả về đối tượng Match nếu toàn bộ chuỗi khớp với mẫu hoặc None
nếu không khớp. Ví dụ sau đây sử dụng hàm fullmatch()
để khớp một chuỗi với bốn chữ số:
import re s = "2021" pattern = '\d{4}' result = re.fullmatch(pattern, s) print(result)
Kết quả:
<re.Match object; span=(0, 4), match='2021'>
Mẫu '\d{4}'
khớp với một chuỗi có bốn chữ số. Do đó, hàm fullmatch()
trả về chuỗi 2021.
Nếu bạn đặt số 2021 ở giữa hoặc cuối chuỗi, hàm fullmatch()
sẽ trả về None
. Ví dụ:
import re s = "Python 3.10 released in 2021" pattern = '\d{4}' result = re.fullmatch(pattern, s) print(result)
Kết quả:
None
Biểu thức chính quy và chuỗi thô trong Python
Điều quan trọng cần lưu ý là Python và biểu thức chính quy là các ngôn ngữ lập trình khác nhau. Chúng có cú pháp riêng của mình.
Module re
là giao diện giữa Python và ngôn ngữ lập trình biểu thức chính quy. Nó hoạt động như một bộ thông dịch giữa chúng.
Để xây dựng một mẫu, biểu thức chính quy thường sử dụng dấu gạch chéo ngược \
ví dụ \d
và \w
. Nhưng điều này xung đột với việc sử dụng dấu gạch chéo ngược của Python cho mục đích tương tự trong chuỗi ký tự.
Ví dụ, giả sử bạn cần khớp chuỗi sau:
s = '\section'
Trong Python, dấu gạch chéo ngược (\
) là một ký tự đặc biệt. Để xây dựng một biểu thức chính quy, bạn cần thoát các dấu gạch chéo ngược bằng cách đặt trước mỗi dấu gạch chéo ngược bằng một dấu gạch chéo ngược:
pattern = '\\section'
Trong biểu thức chính quy, mẫu phải là \\section
. Tuy nhiên, để biểu diễn mẫu này trong chuỗi ký tự trong Python, bạn cần sử dụng thêm hai dấu gạch chéo ngược để thoát cả hai dấu gạch chéo ngược lần nữa:
pattern = '\\\\section'
Đơn giản mà nói, để khớp một dấu gạch chéo ngược (''
), bạn phải viết \\\\
vì biểu thức chính quy phải là \\
và mỗi dấu gạch chéo ngược phải được biểu diễn dưới dạng \\
trong chuỗi ký tự Python.
Điều này dẫn đến nhiều dấu gạch chéo ngược lặp lại. Do đó, làm cho các biểu thức chính quy khó đọc và hiểu.
Một giải pháp là sử dụng chuỗi thô trong Python cho biểu thức chính quy vì chuỗi thô xử lý dấu gạch chéo ngược (\
) như một ký tự bình thường, không phải ký tự đặc biệt.
Để biến chuỗi thông thường thành chuỗi thô, bạn đặt trước nó bằng chữ r
hoặc R
. Ví dụ:
import re s = '\section' pattern = r'\\section' result = re.findall(pattern, s) print(result)
Kết quả:
['\\section']
Lưu ý rằng trong Python '\section'
và '\\section'
là như nhau:
p1 = '\\section' p2 = '\section' print(p1 == p2) # true
Trong thực tế, bạn sẽ thấy các biểu thức chính quy được xây dựng trong Python sử dụng chuỗi thô.
Kết bài
Biểu thức chính quy là một công cụ mạnh mẽ trong Python, cho phép bạn xác định và xử lý các mẫu chuỗi phức tạp một cách hiệu quả. Bằng cách sử dụng đối tượng Pattern
hoặc các hàm trong module re
, bạn có thể dễ dàng tìm kiếm và thao tác với các mẫu chuỗi trong văn bản. Để tránh những rắc rối khi phải thoát các ký tự đặc biệt, việc sử dụng chuỗi thô (raw string) là một phương pháp hữu ích và tiện lợi.
Qua hướng dẫn này, bạn đã được làm quen với cách xây dựng và sử dụng biểu thức chính quy trong Python, từ những ví dụ đơn giản đến phức tạp. Với kiến thức này, bạn có thể áp dụng biểu thức chính quy vào nhiều tình huống thực tế, từ việc kiểm tra định dạng email, số điện thoại đến việc tìm kiếm và thay thế văn bản. Hy vọng rằng, bạn sẽ cảm thấy tự tin hơn trong việc sử dụng biểu thức chính quy để giải quyết các vấn đề về xử lý văn bản trong các dự án lập trình của mình.