Python: Biểu thức chính quy (RegEx)
RegEx hay Biểu thức chính quy, là một chuỗi các ký tự tạo thành một mẫu tìm kiếm. RegEx có thể được sử dụng để kiểm tra xem một chuỗi có chứa mẫu tìm kiếm được chỉ định hay không.
Module RegEx
Python có một gói tích hợp được gọi là re
, có thể được sử dụng để làm việc với Biểu thức chính quy.
import re
RegEx trong Python
Sau khi bạn đã import re thì bạn có thể bắt đầu sử dụng biểu thức chính quy. Ví dụ sau đây tìm kiếm chuỗi để xem nó có bắt đầu bằng "The" và kết thúc bằng "Vietnam" hay không:
import re str = "The rain in Vietnam" result = re.search("^The.*Vietnam$", str)
MetaCharacter
Metacharacter là những ký tự có ý nghĩa đặc biệt. Bảng dưới đây sẽ mô tả chi tiết các metacharacter:
Metacharacter | Mô tả | Ví dụ |
---|---|---|
[] | Một trong các ký tự trong [] | [a-z] tương ứng với một ký tự in thường [A-Z] tương ứng với một ký tự in hoa [0-9] tương ứng với một chữ số [Ab0] tương ứng với A hoặc b hoặc 0 |
\ | Dùng để thoát nghĩa đặc biệt của ký tự đặc biệt; hoặc kết hợp với một số ký tự thường để trở thành ký tự đặc biệt | \$ sẽ biến $ thành ký tự thường \d sẽ tương ứng với [0-9] |
. | Tương ứng với 1 ký tự bất kỳ (ngoại trừ ký tự newline) | x.z tương ứng với một chuỗi có chứa x sau đó đến một ký tự bất kỳ sau đó đến z |
^ | Bắt đầu là ký tự hoặc cụm ký tự ngay sau nó | ^hello tương ứng với bắt đầu là hello ^(abc)xyz tương ứng với bắt đầu là abc |
$ | Kết thúc là ký tự hoặc cụm ký tự ngay trước nó | "planet$" tương ứng với kết thúc phải là t "abc.(vn)$" tương ứng với kết thúc phải là vn |
* | Ký tự hoặc cụm ký tự ngay trước nó không có hoặc có nhiều | "V1*" tương ứng với một chuỗi có chứa V và sau nó có thể không có 1 hoặc có nhiều 1 |
+ | Ký tự hoặc cụm ký tự ngay trước nó phải xuất hiện ít nhất một lần | "V1+" tương ứng với một chuỗi có chứa V và ít nhất có một ký tự 1 sau nó |
? | Ký tự hoặc cụm ký tự ngay trước nó xuất hiện 0 hoặc 1 một lần | "V1" tương ứng với một chuỗi có chứa V và không có hoặc có một ký tự 1 sau nó |
{n, m} | Ký tự hoặc cụm ký tự ngay trước nó xuất hiện từ n đến m lần | "V1{2,5}" tương ứng với chuỗi có chứa V và từ 2 đến 5 ký tự 1 |
| | Chứa chuỗi này hoặc chuỗi kia | "V1|Study" tương ứng với chuỗi "V1" hoặc chuỗi "Study" |
() | Tạo cụm ký tự | "(\.vn)$" tương ứng với kết thúc phải là .vn |
Chuỗi đặc biệt
\
theo sau bởi một trong các ký tự trong danh sách dưới đây sẽ có ý nghĩa đặc biệt:
Ký tự | Mô tả | Ví dụ |
---|---|---|
\A | Khớp nếu chuỗi bắt đầu bằng ký tự hoặc cụm ký tự ngay sau \A | "\AT" tương ứng với chuỗi phải bắt đầu bằng ký tự T |
\b | Khớp nếu chuỗi phải có từ bắt đầu/kết thúc bằng ký tự sau/trước \b ("r" đặt trước mang nghĩa là "chuỗi thô") | r"\bA" tương ứng với chuỗi phải có từ bắt đầu bằng A r"A\b" tương ứng với chuỗi phải có từ kết thúc bằng A |
\B | Khớp nếu chuỗi phải không được có từ bắt đầu/kết thúc bằng ký tự sau/trước \B | r"\BA" tương ứng với chuỗi không được có từ nào bắt đầu bằng A r"A\B" |
\d | Khớp nếu chuỗi chứa một ký tự số bất kỳ (tương đương với [0-9]) | "\d" |
\D | Khớp nếu chuỗi chứa một ký tự số bất kỳ (tương đương với [^0-9]) | "\D" |
\s | Khớp nếu chuỗi chứa một ký tự trắng (dấu cách - space) bất kỳ | "\s" |
\S | Khớp nếu chuỗi chứa một ký tự trắng (dấu cách - space) bất kỳ | "\S" |
\w | Tương đương với [a-zA-Z0-9_] | "\w" |
\W | Tương đương với [^a-zA-Z0-9_] | "\W" |
\Z | Khớp nếu chuỗi kết thúc bằng ký tự hoặc cụm ký tự ngay trước \Z | ".+vn\Z" tương ứng với chuỗi phải kết thúc bằng vn |
Bộ (Cặp ngoặc vuông)
Bộ là một tập hợp các ký tự bên trong một cặp dấu ngoặc vuông []
có ý nghĩa đặc biệt như sau:
Bộ | Mô tả |
---|---|
[abc] | Tương ứng với a hoặc b hoặc c |
[a-z] | Tương ứng với một ký tự bất kỳ trong đoạn từ a đến z |
[^abc] | Tương ứng với một ký tự bất kỳ nhưng không phải a hay b hay c |
[0123] | Tương ứng với một trong các số 0, 1, 2 hoặc 3 |
[0-9] | Tương ứng với một trong các số bất kỳ trong đoạn từ 0 đến 9 |
[0-5][4-9] | Tương ứng với một trong các số từ 0 đến 5 và một trong các sô từ 4 đến 9. Ví dụ 04, 19, 37, 58, ... |
[a-zA-Z] | Tương ứng với một trong các ký tự bất kỳ từ a đến z hoặc từ A đến Z. |
Các hàm của RegEx
Module re
cung cấp một tập hợp các hàm cho phép ta tìm kiếm trong chuỗi để tìm một kết quả phù hợp:
Hàm findall()
Hàm findall()
trả về một danh sách (list) chứa tất cả các kết quả phù hợp.
Ví dụ
In danh sách tất cả các kết quả phù hợp:
import re txt = "The AI in rain" x = re.findall(".in", txt) print(x)
Kết quả:
[' in', 'ain']
Danh sách chứa các kết quả phù hợp theo thứ tự chúng được tìm thấy từ trái sang phải.
Nếu không tìm thấy kết quả phù hợp nào, một danh sách trống sẽ được trả về.
Hàm search()
Hàm search()
sẽ tìm kiếm trong chuỗi 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 sự phù hợp thì chỉ lần xuất hiện đầu tiên của sự phù hợp sẽ được trả về.
Ví dụ sau tìm kiếm ký tự space đầu tiên trong chuỗi:
import re s = "The AI in rain" r = re.search("\s", s) print(f"Ký tự trắng đầu tiên được tìm thấy tại vị trí chỉ số {r.start()}.")
Kết quả:
Ký tự trắng đầu tiên được tìm thấy tại vị trí chỉ số 3.
Nếu không tìm thấy kết quả phù hợp nào sẽ trả về giá trị None.
Hàm split()
Hàm split()
trả về một danh sách trong đó chuỗi đã được tách ở mỗi sự phù hợp:
Ví dụ sau sẽ trả về một list các chuỗi con sau khi tách chuỗi mẹ bằng space:
import re s = "The AI in rain" r = re.split("\s", s) print(r)
Kết quả:
['The', 'AI', 'in', 'rain']
Bạn có thể kiểm soát số lần xuất hiện bằng cách chỉ định tham số maxsplit
:
Ví dụ sau chỉ tách chuỗi ở lần xuất hiện đầu tiên tìm được space:
import re s = "The AI in rain" r = re.split("\s", s, 1) print(r)
Kết quả:
['The', 'AI in rain']
Hàm sub()
Hàm sub()
thay thế các kết quả phù hợp bằng chuỗi mong muốn.
Ví dụ sau thay thế mọi ký tự space bằng ký tự _
:
import re s = "The AI in rain" r = re.sub("\s", '_', s) print(r)
Kết quả:
The_AI_in_rain
Bạn có thể kiểm soát số lượng thay thế bằng cách chỉ định tham số count
:
Ví dụ sau sẽ thay thế 2 lần xuất hiện đầu tiên:
import re s = "The AI in rain" r = re.sub("\s", '_', s, 2) print(r)
Kết quả:
The_AI_in rain
Đối tượng Match
Đối tượng Match là một đối tượng chứa thông tin về tìm kiếm và kết quả.
Lưu ý: Nếu không có kết quả phù hợp, giá trị None
sẽ được trả về, thay vì Đối tượng Match.
Ví dụ 1: Thực hiện tìm kiếm sẽ trả về Đối tượng Match:
import re s = "The AI in rain" r = re.search("AI", s) print(r) #sẽ in ra một đối tượng Match
Kết quả:
<re.Match object; span=(4, 6), match='AI'>
Đối tượng Match có các thuộc tính và phương thức được sử dụng để truy xuất thông tin về tìm kiếm và kết quả:
.span()
trả về một bộ giá trị chứa các vị trí bắt đầu và kết thúc của sự phù hợp.
.string
trả về chuỗi được truyền vào hàm.
.group()
trả về một phần của chuỗi có sự phù hợp.
Ví dụ 2: In vị trí (vị trí bắt đầu và kết thúc) của lần xuất hiện sự phù hợp đầu tiên.
Biểu thức chính quy sau đây sẽ tìm kiếm bất kỳ từ nào bắt đầu bằng chữ "i":
import re s = "The AI in rain" r = re.search(r"\bi\w+", s) print(r.span())
Kết quả:
(4, 6)
Ví dụ 3: In chuỗi được truyền vào hàm:
import re s = "The AI in rain" r = re.search(r"\bi\w+", s) print(r.string)
Kết quả:
The AI in rain
Ví dụ 4: In phần phù hợp của chuỗi.
import re s = "The AI in rain" r = re.search(r"\bi\w+", s) print(r.group())
Kết quả:
in
Lưu ý: Nếu không có kết quả phù hợp, giá trị None
sẽ được trả về.