re --- biểu thức chính quy đơn giản

Mô-đun này triển khai các thao tác biểu thức chính quy. Cú pháp biểu thức chính quy được hỗ trợ là tập con của mô-đun re trong CPython (và thực tế là tập con của biểu thức chính quy mở rộng POSIX).

Các toán tử và chuỗi đặc biệt được hỗ trợ:

.

Khớp với bất kỳ ký tự nào.

[...]

Khớp với tập hợp ký tự. Hỗ trợ các ký tự đơn lẻ và các dải ký tự, bao gồm cả tập hợp phủ định (ví dụ: [^a-c]).

^

Khớp với đầu chuỗi.

$

Khớp với cuối chuỗi.

?

Khớp không hoặc một lần mẫu con trước đó.

*

Khớp không hoặc nhiều lần mẫu con trước đó.

+

Khớp một hoặc nhiều lần mẫu con trước đó.

??

Phiên bản không tham lam của ?, khớp không hoặc một lần, ưu tiên không khớp.

*?

Phiên bản không tham lam của *, khớp không hoặc nhiều lần, ưu tiên khớp ngắn nhất.

+?

Phiên bản không tham lam của +, khớp một hoặc nhiều lần, ưu tiên khớp ngắn nhất.

|

Khớp với mẫu con bên trái hoặc bên phải của toán tử này.

(...)

Nhóm. Mỗi nhóm đều được bắt giữ (chuỗi con mà nó bắt giữ có thể truy cập bằng phương thức match.group()).

(?:...)

Nhóm không bắt giữ. Mỗi nhóm được khớp theo cùng quy tắc như nhóm thông thường, nhưng sẽ không thuộc đối tượng khớp.

\d

Khớp với chữ số. Tương đương với [0-9].

\D

Khớp với ký tự không phải chữ số. Tương đương với [^0-9].

\s

Khớp với khoảng trắng. Tương đương với [ \t-\r].

\S

Khớp với ký tự không phải khoảng trắng. Tương đương với [^ \t-\r].

\w

Khớp với "ký tự từ" (chỉ ASCII). Tương đương với [A-Za-z0-9_].

\W

Khớp với ký tự không phải "ký tự từ" (chỉ ASCII). Tương đương với [^A-Za-z0-9_].

\

Ký tự thoát. Bất kỳ ký tự nào khác theo sau dấu gạch chéo ngược, ngoại trừ những ký tự đã liệt kê ở trên, sẽ được hiểu theo nghĩa đen. Ví dụ: \* tương đương với ký tự * (không được xử lý như toán tử *). Lưu ý rằng \r, \n, v.v. không được xử lý đặc biệt và sẽ tương đương với các chữ cái r, n, v.v. Do đó, không nên sử dụng chuỗi Python thô (r"") cho biểu thức chính quy. Ví dụ: r"\r\n" khi dùng làm biểu thức chính quy tương đương với "rn". Để khớp ký tự CR theo sau bởi LF, hãy dùng "\r\n".

KHÔNG ĐƯỢC HỖ TRỢ:

  • lặp có số lần xác định ({m,n})

  • nhóm được đặt tên ((?P<name>...))

  • các khẳng định nâng cao hơn (\b, \B)

  • ký tự thoát đặc biệt như \r, \n - hãy dùng cách thoát của Python thay thế

  • v.v.

Ví dụ:

import re

# As re doesn't support escapes itself, use of r"" strings is not
# recommended.
regex = re.compile("[\r\n]")

regex.split("line1\rline2\nline3\r\n")

# Result:
# ['line1', 'line2', 'line3', '', '']

Các hàm

re.compile(regex_str: str, flags: int = 0) 'regex'

Biên dịch biểu thức chính quy, trả về đối tượng regex.

re.search(regex_str: str, string: str) 'match | None'

Biên dịch regex_str và tìm kiếm trong string. Khác với match, hàm này sẽ tìm kiếm trong chuỗi từ vị trí đầu tiên khớp với regex (vị trí đó vẫn có thể là 0 nếu regex được neo đầu).

re.sub(regex_str: str, replace: str | Callable, string: str, count: int = 0, flags: int = 0, /) str

Biên dịch regex_str và tìm kiếm trong string, thay thế tất cả các khớp bằng replace, và trả về chuỗi mới.

replace có thể là chuỗi hoặc hàm. Nếu là chuỗi thì có thể dùng chuỗi thoát dạng \<number>\g<number> để mở rộng thành nhóm tương ứng (hoặc chuỗi rỗng cho nhóm không khớp). Nếu replace là hàm thì hàm đó phải nhận một đối số (đối tượng khớp) và trả về chuỗi thay thế.

Nếu count được chỉ định và khác không thì việc thay thế sẽ dừng lại sau khi thực hiện đủ số lần thay thế đó. Đối số flags bị bỏ qua.

Đối tượng Regex

Biểu thức chính quy đã được biên dịch. Các thực thể của lớp này được tạo bằng re.compile().

class re.regex

Đối tượng biểu thức chính quy đã biên dịch được trả về bởi re.compile().

match(string: str, pos: int = 0, endpos: int | None = None) 'match | None'

Áp dụng regex đã biên dịch này lên string, neo tại đầu vùng tìm kiếm, và trả về đối tượng match, hoặc None nếu regex không khớp. Đây là phiên bản tương đương với match ở cấp mô-đun nhưng dùng mẫu đã biên dịch, và hiệu quả hơn nhiều khi áp dụng cùng một mẫu lên nhiều chuỗi.

Tham số tùy chọn pos cho biết chỉ số trong string từ nơi bắt đầu tìm kiếm; mặc định là 0. Điều này không hoàn toàn tương đương với việc cắt lát chuỗi; ký tự mẫu '^' khớp ở đầu thực sự của chuỗi và ở các vị trí ngay sau ký tự xuống dòng, nhưng không nhất thiết tại chỉ số bắt đầu tìm kiếm.

Tham số tùy chọn endpos giới hạn phạm vi tìm kiếm trong string; kết quả sẽ như thể chuỗi chỉ dài endpos ký tự, tức là chỉ các ký tự từ pos đến endpos - 1 được tìm kiếm. Nếu endposNone (mặc định) thì toàn bộ chuỗi sẽ được tìm kiếm.

search(string: str, pos: int = 0, endpos: int | None = None) 'match | None'

Quét qua string để tìm vị trí đầu tiên mà regex đã biên dịch này tạo ra khớp, và trả về đối tượng match, hoặc None nếu không có vị trí nào khớp. Đây là phiên bản tương đương với hàm search() ở cấp mô-đun nhưng dùng mẫu đã biên dịch, và hiệu quả hơn nhiều khi áp dụng cùng một mẫu lên nhiều chuỗi.

Tham số tùy chọn pos cho biết chỉ số trong string từ nơi bắt đầu tìm kiếm; mặc định là 0. Điều này không hoàn toàn tương đương với việc cắt lát chuỗi; ký tự mẫu '^' khớp ở đầu thực sự của chuỗi và ở các vị trí ngay sau ký tự xuống dòng, nhưng không nhất thiết tại chỉ số bắt đầu tìm kiếm.

Tham số tùy chọn endpos giới hạn phạm vi tìm kiếm trong string; kết quả sẽ như thể chuỗi chỉ dài endpos ký tự, tức là chỉ các ký tự từ pos đến endpos - 1 được tìm kiếm. Nếu endposNone (mặc định) thì toàn bộ chuỗi sẽ được tìm kiếm.

sub(replace: str | Callable, string: str, count: int = 0, flags: int = 0, /) str

Tìm kiếm regex đã biên dịch này trong string, thay thế tất cả các khớp bằng replace, và trả về chuỗi mới. Đây là phiên bản tương đương với hàm sub() ở cấp mô-đun nhưng dùng mẫu đã biên dịch, và hiệu quả hơn nhiều khi áp dụng cùng một mẫu lên nhiều chuỗi.

replace có thể là chuỗi hoặc hàm. Nếu là chuỗi thì có thể dùng chuỗi thoát dạng \<number>\g<number> để mở rộng thành nhóm tương ứng (hoặc chuỗi rỗng cho nhóm không khớp). Nếu replace là hàm thì hàm đó phải nhận một đối số (đối tượng khớp) và trả về chuỗi thay thế.

Nếu count được chỉ định và khác không thì việc thay thế sẽ dừng lại sau khi thực hiện đủ số lần thay thế đó. Đối số flags bị bỏ qua.

split(string: str, max_split: int = -1, /) List[str]

Tách string bằng regex. Nếu max_split được cung cấp, nó chỉ định số lần tách tối đa. Trả về danh sách chuỗi (có thể có tối đa max_split+1 phần tử nếu được chỉ định).

Đối tượng khớp

Đối tượng khớp lưu trữ kết quả của một lần khớp thành công.

class re.match(regex_str: str, string: str)

Khớp regex_str với string, neo tại đầu chuỗi, và trả về đối tượng khớp, hoặc None nếu không khớp. Đây là lối tắt ở cấp mô-đun: re.match(regex_str, string) tương đương với re.compile(regex_str).match(string).

Cùng một đối tượng khớp cũng được trả về bởi search(), bởi các phương thức regex.match() / regex.search() của mẫu đã biên dịch, và được truyền vào hàm thay thế dùng bởi sub().

group(index: int) str

Trả về chuỗi (con) khớp. index là 0 cho toàn bộ khớp, 1 trở lên cho từng nhóm bắt giữ. Chỉ hỗ trợ nhóm theo số.