re – Các phép toán biểu thức chính quy – Tài liệu Python 3.10.5 – lại chức năng tìm kiếm trong python

Bạn đang xem : chức năng tìm kiếm lại trong python

re

– Các phép toán biểu thức chính quy

Mã nguồn: Lib / re.py

Mô-đun này cung cấp các hoạt động đối sánh biểu thức chính quy tương tự như
những thứ được tìm thấy ở Perl.

Cả hai mẫu và chuỗi được tìm kiếm đều có thể là chuỗi Unicode ( str < / span>)
cũng như các chuỗi 8 bit ( byte ).
Tuy nhiên, chuỗi Unicode và chuỗi 8 bit không được trộn lẫn:
nghĩa là, bạn không thể đối sánh một chuỗi Unicode với một mẫu byte hoặc
ngược lại; tương tự, khi yêu cầu thay thế, sự thay thế
chuỗi phải cùng loại với cả mẫu và chuỗi tìm kiếm.

Biểu thức chính quy sử dụng ký tự gạch chéo ngược ( '\' ) để biểu thị
các dạng đặc biệt hoặc để cho phép các ký tự đặc biệt được sử dụng mà không cần gọi
ý nghĩa đặc biệt của chúng. Điều này xung đột với cách sử dụng tương tự của Python
ký tự cho cùng mục đích trong chuỗi ký tự; ví dụ, để phù hợp
dấu gạch chéo ngược theo nghĩa đen, người ta có thể phải viết '\\\\' làm mẫu
chuỗi, bởi 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 thể hiện dưới dạng \\ bên trong một chuỗi Python thông thường
theo nghĩa đen. Ngoài ra, xin lưu ý rằng bất kỳ chuỗi thoát không hợp lệ nào trong Python
việc sử dụng dấu gạch chéo ngược trong chuỗi ký tự hiện tạo ra một DeprecationWarning
và trong tương lai nó sẽ trở thành SyntaxError . Hành vi này
sẽ xảy ra ngay cả khi đó là một chuỗi thoát hợp lệ cho một biểu thức chính quy.

Giải pháp là sử dụng ký hiệu chuỗi thô của Python cho biểu thức chính quy
hoa văn; dấu gạch chéo ngược không được xử lý theo bất kỳ cách đặc biệt nào trong một chuỗi ký tự
có tiền tố là 'r' . Vì vậy, r "\ n" là một chuỗi hai ký tự chứa
'\' 'n' , trong khi "\ n " là một chuỗi một ký tự chứa
dòng mới. Thông thường các mẫu sẽ được thể hiện bằng mã Python bằng cách sử dụng
ký hiệu chuỗi.

Điều quan trọng cần lưu ý là hầu hết các hoạt động biểu thức chính quy đều có sẵn dưới dạng
các chức năng và phương pháp cấp mô-đun trên
biểu thức chính quy đã biên dịch . Các chức năng là phím tắt
điều đó không yêu cầu bạn phải biên dịch đối tượng regex trước, nhưng bỏ lỡ một số
tinh chỉnh các thông số.

Xem thêm

Mô-đun regex của bên thứ ba,
có API tương thích với thư viện chuẩn re mô-đun,
nhưng cung cấp chức năng bổ sung và hỗ trợ Unicode kỹ lưỡng hơn.

Cú pháp Cụm từ Thông dụng

Một biểu thức chính quy (hoặc RE) chỉ định một tập hợp các chuỗi phù hợp với nó; các
các hàm trong mô-đun này cho phép bạn kiểm tra xem một chuỗi cụ thể có khớp với một
biểu thức chính quy (hoặc nếu một biểu thức chính quy nhất định khớp với một
chuỗi, tương tự như vậy).

Biểu thức chính quy có thể được nối với nhau để tạo thành biểu thức chính quy mới; nếu một
và B đều là biểu thức chính quy thì AB cũng là biểu thức chính quy.
Nói chung, nếu một chuỗi p khớp với A và một chuỗi q khác khớp với B, thì
chuỗi pq sẽ khớp với AB. Điều này được giữ trừ khi A hoặc B có mức độ ưu tiên thấp
các hoạt động; điều kiện biên giữa A và B; hoặc có nhóm được đánh số
người giới thiệu. Do đó, các biểu thức phức tạp có thể dễ dàng được xây dựng từ các
các biểu thức nguyên thủy như những biểu thức được mô tả ở đây. Để biết chi tiết về lý thuyết
và triển khai các biểu thức chính quy, hãy tham khảo sách Friedl [Frie09] ,
hoặc hầu hết mọi sách giáo khoa về xây dựng trình biên dịch.

Sau đây là giải thích ngắn gọn về định dạng của biểu thức chính quy. Để biết thêm
thông tin và cách trình bày nhẹ nhàng hơn, hãy tham khảo Cách diễn đạt thông dụng HOWTO .

Cụm từ thông dụng có thể chứa cả ký tự đặc biệt và ký tự thông thường. Phần lớn
các ký tự thông thường, như 'A' , 'a' hoặc '0' , là thông thường đơn giản nhất
biểu thức; họ chỉ đơn giản là phù hợp với chính họ. Bạn có thể nối bình thường
các ký tự, vì vậy cuối cùng khớp với chuỗi 'cuối cùng' . (Trong phần còn lại của điều này
, chúng tôi sẽ viết RE’s trong kiểu đặc biệt này , thường không có dấu ngoặc kép và
các chuỗi được so khớp 'trong dấu ngoặc kép' .)

Một số ký tự, như '|' hoặc '(' , là đặc biệt. Đặc biệt
ký tự đại diện cho các lớp ký tự thông thường hoặc ảnh hưởng đến
cách diễn giải các cụm từ thông dụng xung quanh chúng.

< / code>, {m, n} , v.v.) không được
lồng nhau trực tiếp. Điều này tránh sự mơ hồ với hậu tố bổ trợ không tham lam
? và với các công cụ sửa đổi khác trong các triển khai khác. Để áp dụng một giây
lặp lại đến lặp lại bên trong, dấu ngoặc đơn có thể được sử dụng. Ví dụ,
biểu thức (?: a {6}) * khớp với bất kỳ bội số nào trong sáu ký tự 'a' . < / p>

Các ký tự đặc biệt là:

.

(Dấu chấm.) Ở chế độ mặc định, điều này khớp với bất kỳ ký tự nào ngoại trừ một dòng mới. Nếu
cờ cờ DOTALL đã được chỉ định, điều này khớp với bất kỳ ký tự nào
bao gồm một dòng mới.

^

(Dấu mũ) khớp với phần đầu của chuỗi và ở chế độ MULTILINE cũng
khớp ngay sau mỗi dòng mới.

$

Đối sánh với cuối chuỗi hoặc ngay trước dòng mới ở cuối
string và trong chế độ MULTILINE cũng khớp trước dòng mới . foo
khớp với cả ‘foo’ và ‘foobar’, trong khi biểu thức chính quy foo $ khớp
chỉ ‘foo’. Thú vị hơn, tìm kiếm foo. $ trong 'foo1 \ nfoo2 \ n'
khớp với ‘foo2’ bình thường, nhưng ‘foo1’ trong MULTILINE chế độ; tìm kiếm
một $ trong 'foo \ n' sẽ tìm thấy hai kết quả phù hợp (trống): một kết quả ngay trước đó
dòng mới và một dòng ở cuối chuỗi.

*

Khiến RE kết quả khớp với 0 hoặc nhiều lần lặp lại của RE trước đó, như
lặp đi lặp lại nhiều nhất có thể. ab * sẽ khớp với ‘a’, ‘ab’ hoặc ‘a’ được theo sau
bằng bất kỳ số ‘b’s nào.

+

Khiến RE kết quả khớp với 1 hoặc nhiều lần lặp lại của RE trước đó.
ab + sẽ khớp với ‘a’ theo sau là bất kỳ số nào khác 0 của ‘b’s; nó sẽ không
chỉ khớp với ‘a’.

?

Khiến RE kết quả khớp với 0 hoặc 1 lần lặp lại của RE trước đó.
ab? sẽ khớp với ‘a’ hoặc ‘ab’.

*?

,

+?

,

??

'*' , '+' '?' tất cả các vòng loại đều tham lam; họ hợp nhau
càng nhiều văn bản càng tốt. Đôi khi hành vi này không được mong muốn; nếu có
& lt;. * & gt; được so khớp với '& lt; a & gt; b & lt; c & gt; ', nó sẽ khớp với toàn bộ
chuỗi chứ không chỉ '& lt; a & gt;' . Thêm ? sau khi đủ điều kiện
thực hiện trận đấu theo phong cách không tham lam hoặc tối giản; ít
các ký tự càng tốt sẽ được khớp. Sử dụng RE & lt;. *? & Gt; sẽ khớp
chỉ '& lt; a & gt;' .

{m}

Chỉ định rằng chính xác m bản sao của phần trước RE nên được khớp; ít hơn
khớp khiến toàn bộ RE không khớp. Ví dụ: a {6} sẽ khớp
chính xác sáu ký tự 'a' , nhưng không phải năm ký tự.

{m, n}

Khiến RE kết quả khớp từ m đến n lần lặp lại của phần trước
RE, cố gắng so khớp nhiều lần lặp lại nhất có thể. Ví dụ,
a {3,5} sẽ khớp từ 3 đến 5 ký tự 'a' . Bỏ qua m chỉ định một
giới hạn dưới của 0 và việc bỏ qua n chỉ định giới hạn trên vô hạn. Như một
ví dụ, a {4,} b sẽ khớp với 'aaaab' hoặc một nghìn 'a'
theo sau là 'b' , nhưng không phải 'aaab' . Dấu phẩy không được bỏ qua hoặc
công cụ sửa đổi sẽ bị nhầm lẫn với biểu mẫu được mô tả trước đó.

{m, n}?

Khiến RE kết quả là so khớp từ m đến n lần lặp lại trước đó
RE, cố gắng khớp càng ít lần lặp lại càng tốt. Đây là
phiên bản không tham lam của vòng loại trước. Ví dụ, trên
Chuỗi 6 ký tự 'aaaaaa' , a {3,5} sẽ khớp với 5 'a' ,
trong khi a {3,5}? sẽ chỉ khớp với 3 ký tự.

\

Loại bỏ các ký tự đặc biệt (cho phép bạn khớp các ký tự giống
'*' , '?' , v.v.), hoặc báo hiệu một chuỗi đặc biệt; đặc biệt
trình tự được thảo luận bên dưới.

Nếu bạn không sử dụng chuỗi thô để thể hiện mẫu, hãy nhớ rằng Python
cũng sử dụng dấu gạch chéo ngược như một chuỗi thoát trong chuỗi ký tự; nếu trốn thoát
trình tự không được trình phân tích cú pháp của Python nhận dạng, dấu gạch chéo ngược và tiếp theo
ký tự được bao gồm trong chuỗi kết quả. Tuy nhiên, nếu Python sẽ
nhận ra chuỗi kết quả, dấu gạch chéo ngược nên được lặp lại hai lần. Đây
phức tạp và khó hiểu, vì vậy chúng tôi rất khuyến khích bạn sử dụng
chuỗi thô cho tất cả trừ các biểu thức đơn giản nhất.

[]

Được sử dụng để biểu thị một tập hợp các ký tự. Trong một tập hợp:

  • Các ký tự có thể được liệt kê riêng lẻ, ví dụ: [amk] sẽ khớp với 'a' ,
    'm' hoặc 'k' .

  • Phạm vi ký tự có thể được chỉ ra bằng cách cho hai ký tự và tách
    chúng bởi '-' , ví dụ [a-z] sẽ khớp với bất kỳ ký tự ASCII viết thường nào,
    [0-5] [0-9] sẽ khớp với tất cả các số có hai chữ số từ 00 đến < code class = "docutils Lite notranslate"> 59 và
    [0-9A-Fa-f] sẽ khớp với bất kỳ chữ số thập lục phân nào. Nếu - bị thoát (ví dụ:
    [a \ -z] ) hoặc nếu nó được đặt làm ký tự đầu tiên hoặc cuối cùng
    (ví dụ: [- a] hoặc [a-] ), nó sẽ khớp với một ký tự '-' .

  • Các ký tự đặc biệt mất đi ý nghĩa đặc biệt của chúng bên trong các tập hợp. Ví dụ,
    [(+ *)] sẽ khớp với bất kỳ ký tự nào trong số các ký tự chữ '(' , '+' ,
    '*' hoặc ')' .

  • Các lớp ký tự như \ w hoặc \ S (được định nghĩa bên dưới) cũng được chấp nhận
    bên trong một tập hợp, mặc dù các ký tự mà chúng khớp nhau phụ thuộc vào việc
    ASCII hoặc Chế độ LOCALE đang có hiệu lực.

  • Các ký tự không nằm trong một phạm vi có thể được so khớp bằng cách bổ sung
    bộ. Nếu ký tự đầu tiên của tập hợp là '^' , thì tất cả các ký tự
    không có trong tập hợp sẽ được khớp. Ví dụ: [^ 5] sẽ khớp
    bất kỳ ký tự nào ngoại trừ '5' [^^] sẽ khớp với bất kỳ ký tự nào ngoại trừ
    '^' . ^ không có ý nghĩa đặc biệt nếu nó không phải là ký tự đầu tiên trong
    bộ.

  • Để đối sánh một ký tự ']' bên trong một tập hợp, hãy đặt trước tập hợp đó bằng dấu gạch chéo ngược hoặc
    đặt nó ở đầu tập hợp. Ví dụ: cả [() [\] {}]
    [] () [{}] cả hai đều sẽ khớp với một dấu ngoặc đơn.

  • Hỗ trợ các tập hợp lồng nhau và các hoạt động thiết lập như trong Unicode Technical
    Tiêu chuẩn # 18
    có thể được thêm vào trong tương lai. Điều này sẽ thay đổi
    cú pháp, do đó, để tạo điều kiện thuận lợi cho thay đổi này, một FutureWarning sẽ được nâng lên
    trong những trường hợp không rõ ràng trong thời điểm hiện tại.
    Điều đó bao gồm các bộ bắt đầu bằng một chữ '[' hoặc chứa chữ
    chuỗi ký tự '-' , '& amp; & amp;' , '~~' '||' . Đến
    tránh một cảnh báo, hãy thoát khỏi chúng bằng một dấu gạch chéo ngược.

Đã thay đổi trong phiên bản 3.7: FutureWarning được nâng lên nếu a bộ ký tự chứa các cấu trúc
điều đó sẽ thay đổi về mặt ngữ nghĩa trong tương lai.

|

A | B , trong đó A và B có thể là các RE tùy ý, tạo ra một biểu thức chính quy
sẽ khớp với A hoặc B. Một số RE tùy ý có thể được phân tách bằng dấu
'|' theo cách này. Điều này cũng có thể được sử dụng trong các nhóm (xem bên dưới). Như
chuỗi mục tiêu được quét, các RE được phân tách bằng '|' được thử từ trái sang
bên phải. Khi một mẫu hoàn toàn khớp, nhánh đó được chấp nhận. Điều này có nghĩa là
rằng một khi A khớp, B sẽ không được kiểm tra thêm, ngay cả khi
tạo ra một trận đấu tổng thể dài hơn. Nói cách khác, toán tử '|' không bao giờ
tham. Để khớp với một ký tự '|' , hãy sử dụng \ | hoặc đặt nó bên trong
lớp ký tự, như trong [|] .

(...)

Đối sánh bất kỳ biểu thức chính quy nào bên trong dấu ngoặc đơn và cho biết
bắt đầu và kết thúc một nhóm; nội dung của một nhóm có thể được truy xuất sau một trận đấu
đã được thực hiện và có thể được so khớp sau này trong chuỗi với \ number
trình tự đặc biệt, được mô tả dưới đây. Để đối sánh với các nghĩa đen '(' hoặc ')' ,
sử dụng \ ( hoặc \) , hoặc đặt chúng bên trong một lớp ký tự: [(] , [)] .

(? ...)

Đây là ký hiệu mở rộng ( '?' theo sau '(' không có nghĩa
nếu không thì). Ký tự đầu tiên sau '?' xác định ý nghĩa
và cú pháp khác của cấu trúc là. Các tiện ích mở rộng thường không tạo ra một
tập đoàn; (? p & lt; name & gt; ...) là ngoại lệ duy nhất cho quy tắc này. Sau đây là
các tiện ích mở rộng hiện được hỗ trợ.

(? aiLmsux)

(Một hoặc nhiều chữ cái từ đặt 'a' , 'i' , 'L' , 'm' ,
> / code>.) Nhóm khớp với chuỗi trống; các
các chữ cái đặt các cờ tương ứng: re.A (ASCII -chỉ phù hợp),
re.I (bỏ qua trường hợp), re.L (phụ thuộc vào ngôn ngữ),
re.M (nhiều dòng), re.S (chấm khớp với tất cả),
re.U (đối sánh Unicode) và re.X (verbose),
cho toàn bộ biểu thức chính quy.
(Các cờ được mô tả trong Nội dung mô-đun .)
Điều này hữu ích nếu bạn muốn bao gồm các cờ như một phần của
biểu thức chính quy, thay vì truyền đối số cờ cho
Hàm re.compile () . Cờ nên được sử dụng đầu tiên trong
chuỗi biểu thức.

(?: ...)

Không chụp phiên bản của dấu ngoặc thông thường. Phù hợp với bất kỳ điều gì thông thường
biểu thức nằm trong dấu ngoặc đơn, nhưng chuỗi con được so khớp bởi nhóm
không thể được truy xuất sau khi thực hiện một trận đấu hoặc được tham chiếu sau đó trong
mẫu.

(? aiLmsux-imsx: ...)

( Không có hoặc nhiều chữ cái từ tập hợp 'a' , 'i' , 'L' , 'm' ,
's' , 'u' , 'x' , theo sau là '-' theo tùy chọn
một hoặc nhiều chữ cái từ 'i' , 'm' , 's' , 'x' .)
Các chữ cái đặt hoặc loại bỏ các cờ tương ứng:
re.A (chỉ đối sánh ASCII), < span class = "reference internal" title = "re.I"> re.I (bỏ qua trường hợp),
re.L (phụ thuộc vào ngôn ngữ), re.M (nhiều dòng),
re.S (chấm khớp với tất cả), re.U (đối sánh Unicode),
re.X (verbose), về phần của biểu thức.
(Các cờ được mô tả trong Nội dung mô-đun .)

Các chữ cái 'a' , 'L' 'u' loại trừ lẫn nhau khi được sử dụng
dưới dạng cờ nội tuyến, vì vậy chúng không thể được kết hợp hoặc theo sau '-' . Thay vì,
khi một trong số chúng xuất hiện trong nhóm nội tuyến, nó sẽ ghi đè chế độ đối sánh
trong nhóm bao quanh. Trong các mẫu Unicode, (? A: ...) chuyển sang
Đối sánh chỉ ASCII và (? U: ...) chuyển sang đối sánh Unicode
(mặc định). Trong mẫu byte (? L: ...) chuyển sang ngôn ngữ tùy thuộc
đối sánh và (? a: ...) chuyển sang đối sánh chỉ ASCII (mặc định).
Ghi đè này chỉ có hiệu lực đối với nhóm nội tuyến hẹp và
chế độ đối sánh ban đầu được khôi phục bên ngoài nhóm.

Mới trong phiên bản 3.6.

Đã thay đổi trong phiên bản 3.7: Các chữ cái 'a' , 'L' 'u' cũng có thể được sử dụng trong một nhóm.

(? p & lt; name & gt; ...)

Tương tự vào dấu ngoặc đơn thông thường, nhưng chuỗi con được so khớp bởi nhóm là
có thể truy cập thông qua tên nhóm tượng trưng. Tên nhóm phải hợp lệ
Định danh Python và mỗi tên nhóm chỉ được xác định một lần trong một
biểu hiện thông thường. Một nhóm tượng trưng cũng là một nhóm được đánh số, giống như
nhóm không được đặt tên.

Các nhóm được đặt tên có thể được tham chiếu trong ba ngữ cảnh. Nếu mô hình là
(? p & lt; quote & gt; ['"]). *? (? p = quote) (tức là so khớp một chuỗi được trích dẫn với một trong hai
dấu ngoặc kép hoặc đơn):

Bối cảnh tham chiếu đến nhóm “trích dẫn”

Các cách để tham khảo nó

trong cùng một mẫu

  • (? p = quote) (như hình)

  • \ 1

khi xử lý đối tượng khớp m

  • m.group ('quote')

  • m.end ('quote') (v.v.)

trong một chuỗi được chuyển đến repl
đối số của re.sub ()

  • \ g & lt; trích dẫn & gt;

  • \ g & lt; 1 & gt;

  • \ 1

(? p = name)

Một tham chiếu có tên tập đoàn; nó khớp với bất kỳ văn bản nào được so khớp bởi
tên nhóm trước đó được đặt tên.

(? # ...)

Một nhận xét; nội dung của dấu ngoặc đơn giản bị bỏ qua.

(? = ...)

Đối sánh nếu ... đối sánh tiếp theo, nhưng không sử dụng bất kỳ chuỗi nào. Đây là
được gọi là khẳng định nhìn trước. Ví dụ: Isaac (? = Asimov) sẽ khớp
'Isaac' chỉ khi theo sau nó là 'Asimov' .

(?! ...)

Đối sánh if ... không khớp với tiếp theo. Đây là một khẳng định tiêu cực về cái nhìn trước.
Ví dụ: Isaac (?! Asimov) sẽ chỉ khớp với 'Isaac' nếu không
theo sau là 'Asimov' .

(? & lt; = ...)

Đối sánh nếu vị trí hiện tại trong chuỗi được đặt trước bằng một kết quả khớp cho ...
kết thúc ở vị trí hiện tại. Đây được gọi là một cái nhìn tích cực
quả quyết. (? & lt; = abc) def sẽ tìm thấy kết quả phù hợp trong 'abcdef' , vì
lookbehind sẽ sao lưu 3 ký tự và kiểm tra xem mẫu chứa có khớp hay không.
Mẫu được chứa chỉ phải khớp với các chuỗi có độ dài cố định, nghĩa là
abc hoặc a | b được phép, nhưng a * < / code> và a {3,4} thì không. Lưu ý rằng
các mẫu bắt đầu bằng các khẳng định tích cực về ngoại hình sẽ không khớp với
bắt đầu của chuỗi được tìm kiếm; rất có thể bạn sẽ muốn sử dụng
Hàm search () chứ không phải hàm hàm match () :

 

& gt; & gt; & gt;

nhập

lại

& gt; & gt; & gt;

m

=

lại

.

tìm kiếm

(

'(? & lt; = abc) def'

,

'abcdef'

)

& gt; & gt; & gt;

m

.

nhóm

(

0

)

'def'

Ví dụ này tìm một từ sau dấu gạch ngang:

 

& gt; & gt; & gt;

m

=

lại

.

tìm kiếm

(

r

'(? & lt; = -) \ w +'

,

'spam-egg'

)

& gt; & gt; & gt;

m

.

nhóm

(

0

)

'trứng'

Đã thay đổi trong phiên bản 3.5: Đã thêm hỗ trợ cho các tham chiếu nhóm có độ dài cố định.

(? & lt;! ...)

Đối sánh nếu vị trí hiện tại trong chuỗi không được đặt trước kết quả khớp cho
... . Đây được gọi là khẳng định tiêu cực về hậu quả. Tương tự với
khẳng định tích cực, mẫu được chứa chỉ phải khớp với các chuỗi của
một số chiều dài cố định. Các mẫu bắt đầu bằng các khẳng định phía sau tiêu cực có thể
khớp ở đầu chuỗi đang được tìm kiếm.

(? (id / name) yes-pattern | no-pattern)

Sẽ cố gắng so khớp với yes-pattern nếu nhóm có id đã cho hoặc
tên tồn tại và với no-pattern nếu không có. no-pattern
tùy chọn và có thể được bỏ qua. Ví dụ,
(& lt;)? (\ w + @ \ w + (?: \. \ w +) +) (? (1) & gt; | $) là một email kém khớp mô hình, mà
sẽ khớp với '& lt; user@host.com>' cũng như 'user@host.com' , nhưng
không phải với '& lt; user@host.com' cũng không phải 'user@host.com>' . < / p>

Các chuỗi đặc biệt bao gồm '\' và một ký tự từ danh sách bên dưới.
Nếu ký tự thông thường không phải là một chữ số ASCII hoặc một chữ cái ASCII, thì
kết quả RE sẽ khớp với ký tự thứ hai. Ví dụ: \ $ khớp với
ký tự '$' .

\ number

Đối sánh nội dung của nhóm giống nhau con số. Các nhóm được đánh số
bắt đầu từ 1. Ví dụ: (. +) \ 1 khớp với 'the' hoặc '55 55' ,
nhưng không phải 'thethe' (lưu ý dấu cách sau nhóm). Trình tự đặc biệt này
chỉ có thể được sử dụng để khớp với một trong 99 nhóm đầu tiên. Nếu chữ số đầu tiên của
số là 0 hoặc số có 3 chữ số bát phân, nó sẽ không được hiểu là
một trận đấu nhóm, nhưng dưới dạng ký tự có số giá trị bát phân. Bên trong
'[' ']' của một lớp ký tự, tất cả các thoát dạng số được coi là
ký tự.

\ A

Chỉ khớp ở đầu chuỗi.

\ b

So khớp chuỗi trống, nhưng chỉ khớp với chuỗi bắt đầu hoặc kết thúc một từ.
Một từ được định nghĩa là một chuỗi các ký tự từ. Lưu ý rằng chính thức,
\ b được xác định là ranh giới giữa \ w \ W ký tự
(hoặc ngược lại), hoặc giữa \ w và phần đầu / phần cuối của chuỗi.
Điều này có nghĩa là r '\ bfoo \ b' khớp với 'foo' , 'foo.' , '(foo)' ,
'bar foo baz' chứ không phải 'foobar' hoặc ' foo3 '.

Theo mặc định, chữ và số Unicode là những chữ và số được sử dụng trong các mẫu Unicode, nhưng
điều này có thể được thay đổi bằng cách sử dụng cờ ASCII cờ. Ranh giới từ là
được xác định bởi ngôn ngữ hiện tại nếu cờ LOCALE được sử dụng .
Bên trong một phạm vi ký tự, \ b đại diện cho ký tự xóa lùi, cho
khả năng tương thích với các ký tự chuỗi của Python.

\ B

Đối sánh chuỗi trống, nhưng chỉ khi nó không phải ở đầu hay cuối
của một từ. Điều này có nghĩa là r'py \ B ' khớp với ' python ', 'py3' ,
'py2' , nhưng không phải 'py' , 'py . ' hoặc ' py! '.
\ B hoàn toàn ngược lại với \ b , vì vậy các ký tự từ trong Unicode
các mẫu là chữ và số Unicode hoặc dấu gạch dưới, mặc dù điều này có thể
được thay đổi bằng cách sử dụng cờ ASCII cờ. Ranh giới từ là
được xác định bởi ngôn ngữ hiện tại nếu cờ LOCALE được sử dụng .

\ d

Đối với các mẫu Unicode (str):

Đối sánh với bất kỳ chữ số thập phân Unicode nào (nghĩa là, bất kỳ ký tự nào trong
Danh mục ký tự Unicode [Nd]). Điều này bao gồm [0-9]
cũng nhiều ký tự chữ số khác. Nếu cờ ASCII
chỉ được sử dụng [0-9] được khớp.

Đối với các mẫu 8 bit (byte):

Đối sánh với bất kỳ chữ số thập phân nào; điều này tương đương với [0-9] .

\ D

Đối sánh bất kỳ ký tự nào không phải là chữ số thập phân . Đây là
đối lập với \ d . Nếu cờ ASCII được sử dụng, thì cờ này
trở thành tương đương với [^ 0-9] .

\ s

Đối với các mẫu Unicode (str):

Đối sánh các ký tự khoảng trắng Unicode (bao gồm
[\ t \ n \ r \ f \ v] và nhiều ký tự khác, ví dụ:
không gian không phá vỡ bắt buộc bởi các quy tắc kiểu chữ trong nhiều
ngôn ngữ). Nếu cờ ASCII được sử dụng, thì chỉ
[\ t \ n \ r \ f \ v] được khớp.

Đối với các mẫu 8 bit (byte):

Đối sánh các ký tự được coi là khoảng trắng trong bộ ký tự ASCII;
điều này tương đương với [\ t \ n \ r \ f \ v] .

\ S

Đối sánh bất kỳ ký tự nào không phải là ký tự khoảng trắng . Đây là
đối lập với \ s . Nếu cờ ASCII được sử dụng, thì cờ này
trở thành tương đương với [^ \ t \ n \ r \ f \ v] .

\ w

Đối với các mẫu Unicode (str):

Đối sánh các ký tự từ Unicode; cái này bao gồm hầu hết các ký tự
có thể là một phần của từ trong bất kỳ ngôn ngữ nào, cũng như các con số và
dấu gạch dưới. Nếu cờ ASCII được sử dụng, thì chỉ
[a-zA-Z0-9_] được khớp.

Đối với các mẫu 8 bit (byte):

Đối sánh các ký tự được coi là chữ và số trong bộ ký tự ASCII;
điều này tương đương với [a-zA-Z0-9_] . Nếu cờ LOCALE
đã sử dụng, khớp các ký tự được coi là chữ và số trong ngôn ngữ hiện tại
và dấu gạch dưới.

\ W

Đối sánh bất kỳ ký tự nào không phải là ký tự từ . Đây là
ngược lại với \ w . Nếu cờ ASCII được sử dụng, thì cờ này
trở thành tương đương với [^ a-zA-Z0-9_] . Nếu cờ LOCALE
được sử dụng, khớp với các ký tự không phải là chữ và số trong ngôn ngữ hiện tại
cũng không phải gạch dưới.

\ Z

Chỉ khớp ở cuối chuỗi.

Hầu hết các thoát tiêu chuẩn được hỗ trợ bởi các ký tự chuỗi Python cũng là
được chấp nhận bởi trình phân tích cú pháp biểu thức chính quy:

 

\

a

\

b

\

f \

n

\

N

\

r

\

t

\

u

\

Ư

\

v

\

x

\\

(Lưu ý rằng \ b được sử dụng để biểu thị các ranh giới từ và có nghĩa là "khoảng trắng xóa"
chỉ bên trong các lớp nhân vật.)

'\ u' , '\ U' '\ N' trình tự thoát chỉ được nhận dạng trong Unicode
các mẫu. Trong các mẫu byte, chúng là lỗi. Các lần thoát ASCII không xác định
các chữ cái được dành để sử dụng trong tương lai và được coi là lỗi.

Các lần thoát bát phân được đưa vào một dạng giới hạn. Nếu chữ số đầu tiên là 0 hoặc nếu
có ba chữ số bát phân, nó được coi là một thoát bát phân. Nếu không, nó là
một tài liệu tham khảo của nhóm. Đối với các ký tự chuỗi, các lần thoát bát phân luôn ở mức tối đa
có ba chữ số.

Đã thay đổi trong phiên bản 3.3: Chuỗi thoát '\ u' '\ U' đã được đã thêm.

Đã thay đổi trong phiên bản 3.6: Các lỗi thoát không xác định bao gồm '\' và một ký tự ASCII hiện là lỗi.

Đã thay đổi trong phiên bản 3.8: Trình tự thoát '\ N {name}' đã được thêm vào. Như trong chuỗi ký tự,
nó mở rộng thành ký tự Unicode được đặt tên (ví dụ: '\ N {EM DASH}' ).

Nội dung mô-đun

Mô-đun xác định một số hàm, hằng số và một ngoại lệ. Một số
các hàm là phiên bản đơn giản hóa của các phương thức đầy đủ tính năng để biên dịch
biểu thức chính quy. Hầu hết các ứng dụng không tầm thường luôn sử dụng
biểu mẫu.

Cờ

Đã thay đổi trong phiên bản 3.6: Hằng số cờ hiện là các bản sao của RegexFlag , là một lớp con của
enum.IntFlag .

re. A
re. ASCII

Tạo \ w , \ W , \ b , \ B , \ d , \ D , \ s \ S
thực hiện đối sánh chỉ ASCII thay vì đối sánh Unicode đầy đủ. Đây chỉ là
có ý nghĩa đối với các mẫu Unicode và bị bỏ qua đối với các mẫu byte.
Tương ứng với cờ nội tuyến (? A) .

Lưu ý rằng để tương thích ngược, cờ re.U vẫn
tồn tại (cũng như từ đồng nghĩa của nó re.UNICODE và được nhúng
đối tác (? u) ), nhưng những điều này là dư thừa trong Python 3 vì
các kết quả phù hợp là Unicode theo mặc định cho các chuỗi (và so khớp Unicode
không được phép đối với byte).

re. DEBUG

Hiển thị thông tin gỡ lỗi về biểu thức đã biên dịch.
Không có cờ nội tuyến tương ứng.

re. Tôi
re. IGNORECASE

Thực hiện đối sánh không phân biệt chữ hoa chữ thường; các biểu thức như [A-Z] cũng sẽ
khớp các chữ cái thường. Đối sánh Unicode đầy đủ (chẳng hạn như đối sánh Ü
ü ) cũng hoạt động trừ khi cờ re.ASCII được sử dụng để tắt
đối sánh không phải ASCII. Ngôn ngữ hiện tại không thay đổi ảnh hưởng của điều này
cờ trừ khi cờ re.LOCALE cũng được sử dụng.
Tương ứng với cờ nội tuyến (? I) .

Lưu ý rằng khi các mẫu Unicode [a-z] hoặc [A-Z] được sử dụng trong
kết hợp với cờ IGNORECASE , chúng sẽ khớp với 52 ASCII
các chữ cái và 4 chữ cái khác không phải ASCII: ‘İ’ (U + 0130, viết hoa Latinh
chữ I có dấu chấm ở trên), ‘ı’ (U + 0131, chữ cái nhỏ Latinh không có dấu chấm i),
‘S’ (U + 017F, ký tự nhỏ Latinh dài s) và ‘K’ (U + 212A, ký hiệu Kelvin).
Nếu cờ ASCII được sử dụng, thì chỉ các chữ cái 'a 'thành' z '
và ‘A’ thành ‘Z’ được đối sánh.

re. L
re. LOCALE

Tạo \ w , \ W , \ b , \ B và đối sánh không phân biệt chữ hoa chữ thường
phụ thuộc vào ngôn ngữ hiện tại. Cờ này chỉ có thể được sử dụng với byte
các mẫu. Việc sử dụng cờ này không được khuyến khích vì cơ chế ngôn ngữ
rất không đáng tin cậy, nó chỉ xử lý một "nền văn hóa" tại một thời điểm và nó chỉ
hoạt động với ngôn ngữ 8-bit. Đối sánh Unicode đã được bật theo mặc định
trong Python 3 cho các mẫu Unicode (str) và nó có thể xử lý các
địa phương / ngôn ngữ.
Tương ứng với cờ nội tuyến (? L) .

Đã thay đổi trong phiên bản 3.6: re.LOCALE chỉ có thể được sử dụng với các mẫu byte và là
không tương thích với re.ASCII .

Đã thay đổi trong phiên bản 3.7: Các đối tượng biểu thức chính quy được biên dịch với re.LOCALE gắn cờ không
còn phụ thuộc vào ngôn ngữ tại thời điểm biên dịch. Chỉ ngôn ngữ tại
thời gian đối sánh ảnh hưởng đến kết quả đối sánh.

re. M
re. MULTILINE

Khi được chỉ định, ký tự mẫu '^' khớp ở đầu
string và ở đầu mỗi dòng (ngay sau mỗi dòng mới);
và ký tự mẫu '$' khớp ở cuối chuỗi và ở
cuối mỗi dòng (ngay trước mỗi dòng mới). Theo mặc định, '^'
chỉ khớp ở đầu chuỗi và '$' chỉ ở cuối chuỗi
string và ngay trước dòng mới (nếu có) ở cuối chuỗi.
Tương ứng với cờ nội tuyến (? M) .

re. S
re. DOTALL

Làm cho ký tự đặc biệt '.' khớp với bất kỳ ký tự nào, kể cả ký tự
dòng mới; nếu không có cờ này, '.' sẽ khớp với bất kỳ thứ gì ngoại trừ một dòng mới.
Tương ứng với cờ nội dòng (? S) .

re. X
re. VERBOSE

Cờ này cho phép bạn viết các biểu thức chính quy trông đẹp hơn và
dễ đọc hơn bằng cách cho phép bạn phân tách các phần hợp lý của
mô hình và thêm nhận xét. Khoảng trắng trong mẫu bị bỏ qua, ngoại trừ
khi ở trong một lớp ký tự hoặc khi đứng trước dấu gạch chéo ngược không thoát,
hoặc trong các mã thông báo như *? , (?: hoặc ( ? P & lt; ... & gt; .
Khi một dòng chứa # không thuộc lớp ký tự và không phải
trước dấu gạch chéo ngược không thoát, tất cả các ký tự từ ngoài cùng bên trái như vậy
# đến cuối dòng bị bỏ qua.

Điều này có nghĩa là hai đối tượng biểu thức chính quy sau đây phù hợp với
số thập phân có chức năng bằng nhau:

 

a

=

lại

< p class = "o">.

biên dịch

(

r

"" "\ d + # phần tích phân

\. # dấu thập phân

\ d * # một số chữ số thập phân "" "

,

lại

.

X

)

b

=

re

.

biên dịch

(

r

" \ d + \. \ d * "

)

Tương ứng với cờ nội tuyến (? x) .

Các hàm

re. biên dịch

(

pattern

,

flags

=

0

)

Biên dịch một mẫu biểu thức chính quy thành một đối tượng biểu thức chính quy , có thể được sử dụng để đối sánh bằng cách sử dụng
match () , search () và các phương pháp khác, được mô tả
bên dưới.

Hành vi của biểu thức có thể được sửa đổi bằng cách chỉ định một giá trị cờ.
Giá trị có thể là bất kỳ biến nào sau đây, được kết hợp bằng cách sử dụng bitwise OR (
| toán tử).

Trình tự

 

prog

=

re

< p class = "o">.

biên dịch

(

pattern

)

kết quả

=

prog

.

khớp

(

chuỗi

)

tương đương với

 

kết quả

=

lại

< p class = "o">.

khớp

(

pattern

,

chuỗi

)

nhưng sử dụng re.compile () < / span> và lưu biểu thức chính quy kết quả
đối tượng để sử dụng lại hiệu quả hơn khi biểu thức sẽ được sử dụng một số
lần trong một chương trình.

Lưu ý

Các phiên bản đã biên dịch của các mẫu gần đây nhất được chuyển đến
re.compile () và đối sánh cấp mô-đun các chức năng được lưu trong bộ nhớ cache, vì vậy
các chương trình chỉ sử dụng một số biểu thức chính quy tại một thời điểm không cần lo lắng
về việc biên dịch các biểu thức chính quy.

re. tìm kiếm

(

pattern

,

string

,

flags

=

0

)

Quét qua chuỗi để tìm vị trí đầu tiên nơi biểu thức chính quy
mẫu tạo ra một đối sánh và trả về một đối tượng khớp tương ứng . Trả về Không có nếu không có vị trí nào trong chuỗi khớp với
họa tiết; lưu ý rằng điều này khác với việc tìm kiếm kết quả có độ dài bằng 0 ở một số
trỏ trong chuỗi.

re. match

(

pattern

,

string

,

flags

=

0

)

Nếu không hoặc nhiều ký tự ở đầu chuỗi khớp với chuỗi ký tự thông thường
mẫu biểu thức, trả về một đối tượng trùng khớp tương ứng . Trả về Không có nếu chuỗi không khớp với mẫu;
lưu ý rằng điều này khác với đối sánh có độ dài bằng không.

Lưu ý rằng ngay cả trong chế độ MULTILINE , < span class = "reference internal" title = "re.match"> re.match () sẽ chỉ khớp
ở đầu chuỗi chứ không phải ở đầu mỗi dòng.

Nếu bạn muốn tìm một kết quả phù hợp ở bất kỳ đâu trong chuỗi, hãy sử dụng search () < / mã>
thay vào đó (xem thêm search () so với match () ).

re. fullmatch

(

pattern

,

string

,

flags

=

0

)

Nếu toàn bộ chuỗi khớp với mẫu biểu thức chính quy, hãy trả về
đối tượng đối sánh tương ứng . Trả về Không có nếu
chuỗi không khớp với mẫu; lưu ý rằng điều này khác với
trận đấu có độ dài bằng không.

Mới trong phiên bản 3.4.

re. split

(

pattern

,

string

,

maxsplit

=

0

,

cờ

=

0

)

Chia chuỗi theo các lần xuất hiện của mẫu. Nếu bắt dấu ngoặc thì
được sử dụng trong mẫu, sau đó văn bản của tất cả các nhóm trong mẫu cũng được trả về
như một phần của danh sách kết quả. Nếu maxsplit khác không, tối đa maxsplit
sự phân tách xảy ra và phần còn lại của chuỗi được trả về dưới dạng phần tử cuối cùng
trong danh sách.

 

& gt; & gt; & gt;

lại

.

chia

(

r

'\ W +'

,

'Từ, từ, từ.'

)

['Từ', 'từ', 'từ', '']

& gt; & gt; & gt;

lại

.

chia

(

r

'(\ W +)'

,

'Từ, từ, từ.'

)

['Từ', ',', 'từ', ',', 'từ', '.', '']

& gt; & gt; & gt;

lại

.

chia

(

r

'\ W +'

,

'Từ, từ, từ.'

,

1

)

['Từ', 'từ, từ.']

& gt; & gt; & gt;

lại

.

chia

(

'[a-f] +'

,

'0a3B9' ​​

,

cờ

=

re

.

BỎ QUA

)

['0', '3', '9']

Nếu có các nhóm bắt trong dải phân cách và nó khớp ở đầu
chuỗi, kết quả sẽ bắt đầu bằng một chuỗi rỗng. Điều tương tự đối với
cuối chuỗi:

 

& gt; & gt; & gt;

lại

.

chia

(

r

'(\ W +)'

,

'... từ, từ ...'

)

['', '...', 'từ', ',', 'từ', '...', '']

Bằng cách đó, các thành phần phân tách luôn được tìm thấy ở cùng một liên quan
các chỉ số trong danh sách kết quả.

Các kết quả phù hợp trống cho mẫu chỉ chia chuỗi khi không liền nhau
đến một kết quả trống trước đó.

 

& gt; & gt; & gt;

lại

.

chia

(

r

'\ b'

,

'Từ, từ, từ.'

< p class = "p">)

['', 'Từ', ',', 'từ', ',', 'từ', '.']

& gt; & gt; & gt;

lại

.

chia

(

r

'\ W *'

,

< p class = "s1"> '... từ ...'

)

['', '', 'w', 'o', 'r', 'd', 's', '', '']

& gt; & gt; & gt;

lại

.

chia

(

r

'(\ W *)'

,

'... từ ...'

)

['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', ' ',' s ',' ... ',' ',' ',' ']

Đã thay đổi trong phiên bản 3.1: Đã thêm đối số cờ tùy chọn.

Đã thay đổi trong phiên bản 3.7: Đã thêm hỗ trợ phân tách trên một mẫu có thể khớp với một chuỗi trống.

re. findall

(

pattern

,

string

,

flags

=

0

)

Trả lại tất cả các kết quả phù hợp không chồng chéo của mẫu trong chuỗi, dưới dạng danh sách
dây hoặc bộ giá trị. Chuỗi được quét từ trái sang phải và khớp với
được trả lại theo thứ tự được tìm thấy. Các trận đấu trống được bao gồm trong kết quả.

Kết quả phụ thuộc vào số lượng nhóm chụp trong mẫu.
Nếu không có nhóm nào, hãy trả về danh sách các chuỗi khớp với toàn bộ
họa tiết. Nếu có chính xác một nhóm, hãy trả về danh sách các chuỗi
phù hợp với nhóm đó. Nếu có nhiều nhóm, hãy trả về một danh sách
trong số các bộ dây phù hợp với các nhóm. Nhóm không chụp thì không
ảnh hưởng đến hình thức của kết quả.

 

& gt; & gt; & gt;

re

.

findall

(

r

'\ bf [a-z] *'

,

'chân hoặc tay nào bị ngã nhanh nhất'

)

['chân', 'ngã', 'nhanh nhất']

& gt; & gt; & gt;

re

.

findall

(

r

'(\ w +) = (\ d +)'

,

'set width = 20 and height = 10'

)

[('width', '20'), ('height', '10')]

Đã thay đổi trong phiên bản 3.7: Các kết quả phù hợp không trống giờ có thể bắt đầu ngay sau một kết hợp trống trước đó.

re. finditer

(

pattern

,

string

,

flags

=

0

)

Trả về trình lặp , mang lại đối tượng khớp qua
tất cả các kết quả phù hợp không chồng chéo cho mẫu RE trong chuỗi. Chuỗi
được quét từ trái sang phải và các kết quả phù hợp được trả về theo thứ tự được tìm thấy. Trống rỗng
các trận đấu được bao gồm trong kết quả.

Đã thay đổi trong phiên bản 3.7: Các kết quả phù hợp không trống giờ có thể bắt đầu ngay sau một so khớp trống trước đó.

re. sub

(

pattern

,

repl

,

string

,

đếm < / p>

=

0

,

cờ

=

0

)

Trả về chuỗi có được bằng cách thay thế các lần xuất hiện không trùng lặp ngoài cùng bên trái
của mẫu trong chuỗi bởi đại diện thay thế. Nếu không tìm thấy mẫu,
chuỗi được trả về không thay đổi. repl có thể là một chuỗi hoặc một hàm; nếu nó là
một chuỗi, bất kỳ dấu gạch chéo ngược nào thoát ra trong nó đều được xử lý. Đó là, \ n
được chuyển đổi thành một ký tự dòng mới, \ r được chuyển đổi thành ký tự xuống dòng và
vân vân. Các chữ cái ASCII thoát ra không xác định được dành để sử dụng trong tương lai và
được coi là lỗi. Các lối thoát không xác định khác như \ & amp; bị bỏ lại.
Tài liệu tham khảo ngược, chẳng hạn
dưới dạng \ 6 , được thay thế bằng chuỗi con được khớp bởi nhóm 6 trong mẫu.
Ví dụ:

 

& gt; & gt; & gt;

re

.

sub

(

r

'def \ s + ([a-zA-Z _] [a-zA-Z_0-9] *) \ s * \ (\ s * \):'

,

...

r

'tĩnh PyObject * \ npy_ \ 1 (void) \ n { '

,

...

'def myfunc ():'

)

'tĩnh PyObject * \ npy_myfunc (void) \ n {'

Nếu repl là một hàm, nó được gọi cho mỗi lần xuất hiện không trùng lặp của
họa tiết. Hàm nhận một đối tượng trùng khớp duy nhất
và trả về chuỗi thay thế. Ví dụ:

 

& gt; & gt; & gt;

def

dashrepl

(

matchobj

):

...

if

matchobj

.

nhóm

(

0

)

==

'-'

:

trả về

''

...

else

:

return

'-'

& gt; & gt; & gt;

re

.

sub

(

'- {1,2}'

,

dashrepl

,

'pro ---- gram-files'

)

'pro - gram files'

& gt; & gt; & gt;

re

.

sub

(

r

'\ sAND \ s'

,

'& amp;'

,

'Spam Đậu Nướng'

,

cờ

=

lại

< p class = "o">.

BỎ QUA

)

'Đậu Nướng & amp; Thư rác '

Mẫu có thể là một chuỗi hoặc một đối tượng mẫu .

Số đối số tùy chọn là số lần xuất hiện mẫu tối đa
thay thế; số đếm phải là một số nguyên không âm. Nếu bỏ qua hoặc không, tất cả
lần xuất hiện sẽ được thay thế. Các kết quả phù hợp trống cho mẫu chỉ được thay thế
khi không liền kề với kết quả phù hợp trống trước đó, vì vậy sub ('x *', '-', 'abxd') trả về
'- a-b - d-' .

Trong đối số repl kiểu chuỗi, ngoài ký tự thoát ra và
tài liệu tham khảo được mô tả ở trên,
\ g & lt; name & gt; sẽ sử dụng chuỗi con được so khớp bởi nhóm có tên name , như
được định nghĩa bởi cú pháp (? p & lt; name & gt; ...) . \ g & lt; number & gt; sử dụng
số nhóm; \ g & lt; 2 & gt; do đó tương đương với \ 2 , nhưng không mơ hồ
thay thế, chẳng hạn như \ g & lt; 2 & gt; 0 . \ 20 sẽ được hiểu là
tham chiếu đến nhóm 20, không tham chiếu đến nhóm 2 theo sau là từ
ký tự '0' . Backreference \ g & lt; 0 & gt; thay thế toàn bộ
chuỗi con được so khớp bởi RE.

Đã thay đổi trong phiên bản 3.1: Đã thêm đối số cờ tùy chọn.

Đã thay đổi trong phiên bản 3.5: Các nhóm không khớp được thay thế bằng một chuỗi trống.

Đã thay đổi trong phiên bản 3.6: Các thoát không xác định trong mẫu bao gồm '\' và một chữ cái ASCII
bây giờ là lỗi.

Đã thay đổi trong phiên bản 3.7: Các lần thoát không xác định trong repl bao gồm '\' và một chữ cái ASCII
bây giờ là lỗi.

Đã thay đổi trong phiên bản 3.7: Các kết quả phù hợp trống cho mẫu được thay thế khi liền kề với mẫu trước đó
đối sánh không trống.

re. subn

(

pattern

,

repl

,

string

,

đếm < / p>

=

0

,

cờ

=

0

)

Thực hiện thao tác tương tự như sub () < / span>, nhưng trả về một tuple (new_string,
number_of_subs_made)
.

Đã thay đổi trong phiên bản 3.1: Đã thêm đối số cờ tùy chọn.

Đã thay đổi trong phiên bản 3.5: Các nhóm không khớp được thay thế bằng một chuỗi trống.

re. Escape

(

pattern

)

Thoát các ký tự đặc biệt trong mẫu.
Điều này rất hữu ích nếu bạn muốn so khớp một chuỗi ký tự tùy ý có thể
có siêu ký tự biểu thức chính quy trong đó. Ví dụ:

 

& gt; & gt; & gt;

print

(

re

.

thoát

(

'https://www.python.org '

))

https: // www \ .python \ .org

& gt; & gt; & gt;

legal_chars

=

string

.

ascii_lowercase

+

string

.

chữ số

+

"! # $% & amp; ' * + -. ^ _ `| ~:"

& gt; & gt; & gt;

print

(

'[

% s

] + '

%

re

< p class = "o">.

thoát

(

legal_chars

))

[abcdefghijklmnopqrstuvwxyz0123456789! \ # \ $% \ & amp; '\ * \ + \ - \. \. \ ^ _ `\ | \ ~:] +

& gt; & gt; & gt;

toán tử

=

[

'+'

,

'-'

,

< p class = "s1"> '*'

,

'/'

,

'**'

]

& gt; & gt; & gt;

print

(

'|'

.

tham gia

(

map

(

lại

.

thoát

< p class = "p">,

đã sắp xếp

(

toán tử

,

đảo ngược

=

Đúng < / p>

))))

/ | \ - | \ + | \ * \ * | \ *

Không được sử dụng hàm này cho chuỗi thay thế trong sub ()
subn () , chỉ nên thoát dấu gạch chéo ngược. Ví dụ:

 

& gt; & gt; & gt;

umbers_re

=

r

'\ d +'

& gt; & gt; & gt;

mẫu

=

'/ usr / sbin / sendmail - 0 lỗi, 12 cảnh báo '

& gt; & gt; & gt;

print

(

re

.

sub

(

umbers_re

,

umbers_re

.

thay thế

(

'

\\

'

,

r

'

\\ < / p>

'

),

mẫu

))

/ usr / sbin / sendmail - \ d + lỗi, \ d + cảnh báo

Đã thay đổi trong phiên bản 3.3: Ký tự '_' không còn được thoát nữa.

Đã thay đổi trong phiên bản 3.7: Chỉ các ký tự có thể có ý nghĩa đặc biệt trong biểu thức chính quy
được trốn thoát. Do đó, '!' , '"' , '%' < '/' , ':' , ';' < / code>, '& lt;' , '=' , '& gt;' , '@'
"` " không còn được thoát nữa.

re. tẩy

(

)

Xóa bộ nhớ cache của cụm từ thông dụng.

Ngoại lệ

ngoại lệ re. error

(

msg

,

pattern

=

Không có < / p>,

pos

=

Không có

)

Ngoại lệ được đưa ra khi một chuỗi được truyền đến một trong các hàm ở đây không phải là
biểu thức chính quy hợp lệ (ví dụ: nó có thể chứa các dấu ngoặc đơn không khớp)
hoặc khi một số lỗi khác xảy ra trong quá trình biên dịch hoặc so khớp. Nó không bao giờ là một
lỗi nếu một chuỗi không chứa kết quả phù hợp với một mẫu. Trường hợp lỗi có
các thuộc tính bổ sung sau:

msg

Thông báo lỗi chưa được định dạng.

pattern

Mẫu biểu thức chính quy.

pos

Chỉ mục trong mẫu không biên dịch được (có thể là Không có ).

lineno

Dòng tương ứng với pos (có thể là Không ).

colno

Cột tương ứng với pos (có thể là Không ).

Đã thay đổi trong phiên bản 3.5: Đã thêm các thuộc tính bổ sung.

Đối tượng Biểu thức Chính quy

Các đối tượng biểu thức chính quy đã biên dịch hỗ trợ các phương thức sau và
thuộc tính:

Mẫu. search

(

string < p class = "option"> [

, pos

[

, endpos

]

]

)

Quét qua chuỗi để tìm vị trí đầu tiên nơi thường xuyên này
biểu thức tạo ra một đối sánh và trả về một đối tượng khớp tương ứng . Trả về Không có nếu không có vị trí nào trong chuỗi khớp với
họa tiết; lưu ý rằng điều này khác với việc tìm kiếm kết quả có độ dài bằng 0 ở một số
trỏ trong chuỗi.

Vị trí tham số thứ hai tùy chọn cung cấp một chỉ mục trong chuỗi nơi
tìm kiếm là để bắt đầu; nó mặc định là 0 . Điều này không hoàn toàn tương đương với
cắt chuỗi; ký tự mẫu '^' khớp ở phần đầu thực
của chuỗi và tại các vị trí ngay sau một dòng mới, nhưng không nhất thiết phải ở
lập chỉ mục nơi bắt đầu tìm kiếm.

Tham số tùy chọn endpos giới hạn khoảng cách chuỗi sẽ được tìm kiếm; nó
sẽ như thể chuỗi dài các ký tự endpos, vì vậy chỉ các ký tự
từ pos đến endpos - 1 sẽ được tìm kiếm kết quả phù hợp. Nếu endpos ít hơn
so với pos, sẽ không tìm thấy kết quả phù hợp nào; ngược lại, nếu rx là một
đối tượng biểu thức, rx.search (string, 0, 50) tương đương với
rx.search (string [: 50], 0) .

 

& gt; & gt; & gt;

mẫu

=

lại

.

biên dịch

(

"d"

)

& gt; & gt; & gt;

mẫu

.

tìm kiếm

(

"dog"

)

# Khớp ở chỉ mục 0

& lt; re.Match đối tượng; span = (0, 1), match = 'd' & gt;

& gt; & gt; & gt;

mẫu

.

tìm kiếm

(

"dog"

,

1

)

# Không trùng khớp; tìm kiếm không bao gồm "d"

Mẫu. match

(

string < p class = "option"> [

, pos

[

, endpos

]

]

)

Nếu không hoặc nhiều ký tự ở đầu chuỗi khớp với thông thường này
biểu thức, trả về một đối tượng trùng khớp tương ứng .
Trả về Không có nếu chuỗi không khớp với mẫu; lưu ý rằng đây là
khác với đối sánh có độ dài bằng không.

Các tham số pos và endpos tùy chọn có cùng ý nghĩa với
phương thức search () .

 

& gt; & gt; & gt;

mẫu

=

lại

.

biên dịch

(

"o"

)

& gt; & gt; & gt;

pattern

.

trùng khớp

(

"dog"

)

# Không đối sánh vì "o" là không phải ở đầu "dog".

& gt; & gt; & gt;

pattern

.

trùng khớp

(

"dog"

,

1

)

# Khớp vì "o" là ký tự thứ 2 của "dog".

& lt; re.Match đối tượng; span = (1, 2), match = 'o' & gt;

Nếu bạn muốn tìm một kết quả phù hợp ở bất kỳ đâu trong chuỗi, hãy sử dụng
Thay vào đó, search () (xem thêm search () so với match () ).

Mẫu. fullmatch

(

string < p class = "option"> [

, pos

[

, endpos

]

]

)

Nếu toàn bộ chuỗi khớp với biểu thức chính quy này, hãy trả về một
đối tượng khớp . Trả về Không có nếu chuỗi không
phù hợp với mô hình; lưu ý rằng điều này khác với đối sánh có độ dài bằng không.

Các tham số pos và endpos tùy chọn có cùng ý nghĩa với
phương thức search () .

 

& gt; & gt; & gt;

mẫu

=

lại

.

biên dịch

(

"o [gh]"

)

& gt; & gt; & gt;

mẫu

.

fullmatch

(

"dog"

)

# Không đối sánh vì "o" là không phải ở đầu "dog".

& gt; & gt; & gt;

mẫu

.

fullmatch

(

"yêu tinh"

)

# Không khớp nào không phải là chuỗi đầy đủ trận đấu.

& gt; & gt; & gt;

mẫu

.

fullmatch

(

"doggie"

,

1

,

3

)

# Đối sánh trong giới hạn đã cho.

& lt; re.Match đối tượng; span = (1, 3), match = 'og' & gt;

Mới trong phiên bản 3.4.

Mẫu. split

(

string

,

maxsplit

=

0

)

Giống hệt với split () , sử dụng mẫu đã biên dịch.

Mẫu. findall

(

string < p class = "option"> [

, pos

[

, endpos

]

]

)

Tương tự với findall () , sử dụng mẫu đã biên dịch, nhưng
cũng chấp nhận các tham số pos và endpos tùy chọn giới hạn tìm kiếm
khu vực như cho search () .

Mẫu. finditer

(

string < p class = "option"> [

, pos

[

, endpos

]

]

)

Tương tự với finditer () , sử dụng mẫu đã biên dịch, nhưng
cũng chấp nhận các tham số pos và endpos tùy chọn giới hạn tìm kiếm
khu vực như cho search () .

Mẫu. sub

(

repl

,

string

,

đếm

=

0

)

Giống hệt với sub () , sử dụng mẫu đã biên dịch.

Mẫu. subn

(

repl

,

string

,

đếm

=

0

)

Giống hệt với subn () , sử dụng mẫu đã biên dịch.

Mẫu. flags

Các cờ phù hợp với regex. Đây là sự kết hợp của các cờ được trao cho
biên dịch () , bất kỳ (? ...) cờ nội dòng trong mẫu và ẩn
các cờ như UNICODE nếu mẫu là chuỗi Unicode.

Mẫu. groups

Số lượng nhóm chụp trong mẫu.

Mẫu. groupindex

Một từ điển ánh xạ bất kỳ tên nhóm tượng trưng nào được xác định bởi (? p & lt; id & gt;) thành nhóm
những con số. Từ điển trống nếu không có nhóm biểu tượng nào được sử dụng trong
mẫu.

Mẫu. mẫu

Chuỗi mẫu mà từ đó đối tượng mẫu được biên dịch.

Đã thay đổi trong phiên bản 3.7: Đã thêm hỗ trợ copy.copy () copy.deepcopy () . Tổng hợp
các đối tượng biểu thức chính quy được coi là nguyên tử.

Đối sánh các đối tượng

Các đối tượng khớp luôn có giá trị boolean là True .
match () search () trả về Không có
khi không có kết quả phù hợp, bạn có thể kiểm tra xem có kết quả phù hợp hay không với
câu lệnh if :

 

khớp

=

lại

< p class = "o">.

tìm kiếm

(

pattern

,

chuỗi

)

nếu

khớp

:

process

(

match

)

Đối tượng khớp hỗ trợ các phương thức và thuộc tính sau:

Khớp. expand

(

mẫu

)

Trả về chuỗi có được bằng cách thực hiện thay thế dấu gạch chéo ngược trên mẫu
mẫu chuỗi, được thực hiện bởi sub () phương pháp.
Các lối thoát như \ n được chuyển đổi thành các ký tự thích hợp,
và các tham chiếu ngược dạng số ( \ 1 , \ 2 ) và các tham chiếu hậu có tên
( \ g & lt; 1 & gt; , \ g & lt; name & gt; ) được thay thế bằng nội dung của
nhóm tương ứng.

Đã thay đổi trong phiên bản 3.5: Các nhóm không khớp được thay thế bằng một chuỗi trống.

Khớp. group

(

[

group1, ...

]

)

Trả về một hoặc nhiều nhóm con của kết quả phù hợp. Nếu có một đối số duy nhất,
kết quả là một chuỗi đơn; nếu có nhiều đối số, kết quả là
bộ dữ liệu với một mục cho mỗi đối số. Không có đối số, group1 mặc định là 0
(toàn bộ trận đấu được trả lại). Nếu đối số groupN bằng 0, thì đối số tương ứng
giá trị trả về là toàn bộ chuỗi phù hợp; nếu nó nằm trong phạm vi bao gồm
[1..99], nó là chuỗi khớp với nhóm có dấu ngoặc đơn tương ứng. Nếu một
số nhóm âm hoặc lớn hơn số nhóm được xác định trong
mẫu, ngoại lệ IndexError được đưa ra. Nếu một nhóm được chứa trong một
một phần của mẫu không khớp, kết quả tương ứng là Không có .
Nếu một nhóm nằm trong một phần của mẫu đã khớp nhiều lần,
trận đấu cuối cùng được trả lại.

 

& gt; & gt; & gt;

m

=

lại

.

khớp

(

r

" (\ w +) (\ w +) "

,

" Isaac Newton, nhà vật lý "

)

& gt; & gt; & gt;

m

.

nhóm

(

0

)

# Toàn bộ trận đấu

'Isaac Newton'

& gt; & gt; & gt;

m

.

nhóm

(

1

)

# Nhóm con có dấu ngoặc đơn đầu tiên.

'Isaac'

& gt; & gt; & gt;

m

.

nhóm

(

2

)

# Nhóm con có dấu ngoặc đơn thứ hai.

'Newton'

& gt; & gt; & gt;

m

.

nhóm

(

1

,

2

)

# Nhiều đối số cung cấp cho chúng ta một bộ giá trị.

('Isaac', 'Newton')

Nếu biểu thức chính quy sử dụng cú pháp (? p & lt; name & gt; ...) , groupN
các đối số cũng có thể là chuỗi xác định các nhóm theo tên nhóm của chúng. Nếu một
đối số chuỗi không được sử dụng làm tên nhóm trong mẫu, IndexError
ngoại lệ được nêu ra.

Một ví dụ phức tạp vừa phải:

 

& gt; & gt; & gt;

m

=

re

.

khớp

(

r

"(? p & lt; first_name & gt; \ w +) (? p & lt; last_name & gt; \ w +)"

,

" Malcolm Reynolds "

)

& gt; & gt; & gt;

m

.

nhóm

(

'first_name'

)

'Malcolm'

& gt; & gt; & gt;

m

.

nhóm

(

'last_name'

)

'Reynolds'

Các nhóm được đặt tên cũng có thể được tham chiếu bằng chỉ mục của chúng:

 

& gt; & gt; & gt;

m

.

nhóm

(

1

)

'Malcolm'

& gt; & gt; & gt;

m

.

nhóm

(

2

)

'Reynolds'

Nếu một nhóm đối sánh nhiều lần, chỉ có thể truy cập trận đấu cuối cùng:

 

& gt; & gt; & gt;

m

=

lại

.

khớp

(

r

" (..) + "

,

" a1b2c3 "

)

# Đối sánh 3 lần.

& gt; & gt; & gt;

m

.

nhóm

(

1

)

# Chỉ trả về kết quả phù hợp cuối cùng.

'c3'

Khớp. __ getitem__

(

g

)

Điều này giống với m.group (g) . Điều này cho phép truy cập dễ dàng hơn vào
một nhóm riêng lẻ từ một trận đấu:

 

& gt; & gt; & gt;

m

=

lại

.

khớp

(

r

" (\ w +) (\ w +) "

,

" Isaac Newton, nhà vật lý "

)

& gt; & gt; & gt;

m

[

0

]

# Toàn bộ trận đấu

'Isaac Newton'

& gt; & gt; & gt;

m

[

1

]

# Nhóm con có dấu ngoặc đơn đầu tiên.

'Isaac'

& gt; & gt; & gt;

m

[

2

]

# Nhóm con thứ hai trong ngoặc đơn.

'Newton'

Mới trong phiên bản 3.6.

Khớp. nhóm

(

default

=

Không có

)

Trả về một bộ giá trị chứa tất cả các nhóm con của đối sánh, từ 1 trở lên
nhiều nhóm đang trong mô hình. Đối số mặc định được sử dụng cho các nhóm
không tham gia trận đấu; nó mặc định là Không có .

Ví dụ:

 

& gt; & gt; & gt;

m

=

lại

.

khớp

(

r

" (\ d +) \. (\ d +) "

,

" 24.1632 "

)

& gt; & gt; & gt;

m

.

nhóm

()

('24', '1632')

Nếu chúng tôi đặt vị trí thập phân và mọi thứ sau nó là tùy chọn, thì không phải tất cả các nhóm
có thể tham gia vào trận đấu. Các nhóm này sẽ mặc định thành Không có trừ khi
đối số mặc định được đưa ra:

 

& gt; & gt; & gt;

m

=

lại

.

khớp

(

r

" (\ d +) \.? (\ d +)? "

,

" 24 "

< p class = "p">)

& gt; & gt; & gt;

m

.

nhóm

()

# Nhóm thứ hai mặc định là Không.

('24', Không có)

& gt; & gt; & gt;

m

.

nhóm

(

'0'

)

# Bây giờ, nhóm thứ hai mặc định là '0'.

('24', '0')

Khớp. groupdict

(

default

=

Không có

)

Trả về một từ điển chứa tất cả các nhóm con được đặt tên của đối sánh, được khóa bởi
tên nhóm con. Đối số mặc định được sử dụng cho các nhóm không
tham gia trận đấu; nó mặc định là Không có . Ví dụ:

 

& gt; & gt; & gt;

m

=

lại

.

khớp

(

r

" (? p & lt; first_name & gt; \ w +) (? p & lt; last_name & gt; \ w +) "

,

" Malcolm Reynolds "

)

& gt; & gt; & gt;

m

.

groupdict

()

{'first_name': 'Malcolm', 'last_name': 'Reynolds'}

Khớp. start

(

[

group

]

)

Khớp. end

(

[

group

]

)

Trả về các chỉ số của phần đầu và phần cuối của chuỗi con được so khớp theo nhóm;
mặc định của nhóm là 0 (nghĩa là toàn bộ chuỗi con phù hợp). Trả về - 1 nếu
nhóm tồn tại nhưng không đóng góp vào trận đấu. Đối với đối tượng khớp m, và
một nhóm g đã đóng góp vào trận đấu, chuỗi con được so khớp bởi nhóm g
(tương đương với m.group (g) ) là

 

m

.

string

< p class = "p"> [

m

.

start

(

g

):

m

.

end

(

g

)]

Lưu ý rằng m.start (group) sẽ bằng m.end (group) nếu nhóm khớp với một
chuỗi null. Ví dụ: sau m = re.search ('b (c?)', 'Cba') ,
m.start (0) là 1, m.end (0) là 2, m.start (1) m.end (1)
2 và m.start (2) tăng IndexError ngoại lệ.

Một ví dụ sẽ xóa remove_this khỏi địa chỉ email:

 

& gt; & gt; & gt;

email

=

"tony@tiremove_thisger.net"

& gt; & gt; & gt;

m

=

lại

.

tìm kiếm

(

"remove_this"

,

email

)

& gt; & gt; & gt;

email

[:

m

.

bắt đầu

()]

+

email

[

m

.

end

():]

'tony@tiger.net'

Khớp. span

(

[

group

]

)

Đối với kết quả phù hợp m, hãy trả về 2-tuple (m.start (group), m.end (group)) . Ghi chú
rằng nếu nhóm không đóng góp vào kết quả phù hợp, thì đây là (- 1, -1) .
mặc định của nhóm là 0, toàn bộ trận đấu.

Khớp. pos

Giá trị của pos đã được chuyển đến search () hoặc
match () phương thức của một đối tượng regex . Đây là
chỉ mục vào chuỗi mà tại đó công cụ RE bắt đầu tìm kiếm một kết quả phù hợp.

Khớp. endpos

Giá trị của endpos đã được chuyển đến tìm kiếm ( ) hoặc
match () phương thức của một đối tượng regex . Đây là
chỉ mục vào chuỗi mà công cụ RE sẽ không chuyển sang.

Khớp. lastindex

Chỉ mục số nguyên của nhóm thu thập được so khớp cuối cùng hoặc Không có nếu không có nhóm
đã được khớp ở tất cả. Ví dụ: các biểu thức (a) b , ((a) (b))
((ab)) sẽ có lastindex == 1 nếu được áp dụng cho chuỗi 'ab' , trong khi
biểu thức (a) (b) sẽ có lastindex == 2 , nếu được áp dụng cho cùng một
chuỗi.

Khớp. lastgroup

Tên của nhóm chụp phù hợp cuối cùng hoặc Không có nếu nhóm không có
có tên hoặc nếu không có nhóm nào trùng khớp.

Khớp. re

Đối tượng biểu thức chính quy match () hoặc
Phương thức search () đã tạo ra trường hợp khớp này.

Khớp. string

Chuỗi được chuyển tới match () hoặc search () .

Đã thay đổi trong phiên bản 3.7: Đã thêm hỗ trợ copy.copy () copy.deepcopy () . Đối sánh các đối tượng
được coi là nguyên tử.

Ví dụ về Cụm từ Thông dụng

Kiểm tra một cặp

Trong ví dụ này, chúng tôi sẽ sử dụng hàm trợ giúp sau để hiển thị kết quả khớp
đồ vật duyên dáng hơn một chút:

 

def

displaymatch

(

< p class = "n"> khớp

):

nếu

trùng khớp

Không

:

trả về

Không có

return

'& lt; Khớp:

% r

, groups =

% r

& gt; '

%

(

khớp

.

nhóm < / p>

(),

khớp

.

nhóm

())

Giả sử bạn đang viết một chương trình poker trong đó ván bài của người chơi được biểu thị là
một chuỗi 5 ký tự với mỗi ký tự đại diện cho một lá bài, “a” là át chủ bài, “k”
cho vua, “q” cho nữ hoàng, “j” cho jack, “t” cho 10 và “2” đến “9”
đại diện cho thẻ có giá trị đó.

Để xem liệu một chuỗi đã cho có phải là một chuỗi hợp lệ hay không, người ta có thể làm như sau:

 

& gt; & gt; & gt;

hợp lệ

=

lại

.

biên dịch

(

r

" ^ [a2-9tjqk]

{5}

$ "

)

& gt; & gt; & gt;

displaymatch

(

hợp lệ

.

khớp

(

"akt5q"

))

# Hợp lệ.

"& lt; Đối sánh: 'akt5q', groups = () & gt;"

& gt; & gt; & gt;

displaymatch

(

hợp lệ

.

khớp

(

"akt5e"

))

# Không hợp lệ.

& gt; & gt; & gt;

displaymatch

(

hợp lệ

.

khớp

(

"akt"

))

# Không hợp lệ.

& gt; & gt; & gt;

displaymatch

(

hợp lệ

.

khớp

(

"727ak"

))

# Hợp lệ.

"& lt; Đối sánh: '727ak', groups = () & gt;"

Mặt cuối cùng, "727ak" , chứa một cặp hoặc hai thẻ có giá trị giống nhau.
Để đối sánh điều này với một biểu thức chính quy, người ta có thể sử dụng các tham chiếu ngược như sau:

 

& gt; & gt; & gt;

cặp

=

lại

.

biên dịch

(

r

". * (.). * \ 1 "

)

& gt; & gt; & gt;

displaymatch

(

cặp

.

khớp

(

"717ak"

))

# Cặp số 7.

"& lt; Đối sánh: '717', groups = ('7',) & gt;"

& gt; & gt; & gt;

displaymatch

(

cặp

.

khớp

(

"718ak"

))

# Không có cặp nào.

& gt; & gt; & gt;

displaymatch

(

cặp

.

khớp

(

"354aa"

))

# Cặp át.

"& lt; Đối sánh: '354aa', groups = ('a',) & gt;"

Để tìm xem cặp này bao gồm thẻ nào, người ta có thể sử dụng
Phương thức group () của đối tượng khớp trong theo cách sau:

 

& gt; & gt; & gt;

cặp

=

lại

.

biên dịch

(

r

". * (.). * \ 1 "

)

& gt; & gt; & gt;

cặp

.

trùng khớp

(

"717ak"

)

.

nhóm

(

1

)

'7'

# Lỗi vì re.match () trả về None, không có phương thức group ():

& gt; & gt; & gt;

cặp

.

trùng khớp

(

"718ak"

)

.

nhóm

(

1

)

Traceback (cuộc gọi gần đây nhất):

Tệp

"& lt; pyshell # 23 & gt;"

, dòng

1

, trong

& lt; module & gt;

lại

.

trùng khớp

(

r

". * (.). * \ 1"

,

"718ak"

)

.

nhóm

(

1

)

AttributeError

:

Đối tượng 'NoneType' không có thuộc tính 'group'

& gt; & gt; & gt;

cặp

.

trùng khớp

(

"354aa"

)

.

nhóm

(

1

)

'a'

Mô phỏng scanf ()

Python hiện không có hàm tương đương với scanf () . Thường xuyên
các biểu thức thường mạnh mẽ hơn, mặc dù cũng dài dòng hơn
chuỗi định dạng scanf () . Bảng dưới đây cung cấp nhiều hơn hoặc ít hơn
ánh xạ tương đương giữa mã thông báo định dạng scanf () và thông thường
biểu thức.

scanf () Mã thông báo

Cụm từ Thông dụng

% c

.

% 5c

. {5}

% d

[- +]? \ d +

% e , % E , % f < / code>, % g

[- +]? (\ d + (\. \ d *)? | \. \ d +) ([eE] [- +]? \ d +)?

% i

[- +]? (0 [xX] [\ dA-Fa-f] + | 0 [0-7] * | \ d +)

% o

[- +]? [0-7] +

% s

\ S +

% u

\ d +

% x , % X

[- +]? (0 [xX])? [\ dA-Fa-f] +

Để trích xuất tên tệp và các số từ một chuỗi như

 

/

usr

/

< p class = "n"> sbin

/

sendmail

-

0

lỗi

,

4 < / p>

cảnh báo

bạn sẽ sử dụng định dạng scanf () như

 

%

s

-

< p class = "o">%

d

lỗi

,

%

d

cảnh báo

Cụm từ thông dụng tương đương sẽ là

 

(

\

S

+

)

-

(

\

d < / p>

+

)

lỗi

,

(

\

d

+

)

cảnh báo

search () so với match ()

Python cung cấp hai phép toán nguyên thủy khác nhau dựa trên các biểu thức chính quy:
re.match () chỉ kiểm tra tại đầu chuỗi, trong khi
re.search () kiểm tra sự trùng khớp ở bất kỳ đâu trong chuỗi (đây là những gì Perl
theo mặc định).

Ví dụ:

 

& gt; & gt; & gt;

lại

.

khớp

(

"c"

,

"abcdef"

< p class = "p">)

# Không trùng khớp

& gt; & gt; & gt;

lại

.

tìm kiếm

(

"c"

,

"abcdef"

< p class = "p">)

# Khớp

& lt; re.Match đối tượng; span = (2, 3), match = 'c' & gt;

Các biểu thức chính quy bắt đầu bằng '^' có thể được sử dụng với search () tới
hạn chế khớp ở đầu chuỗi:

 

& gt; & gt; & gt;

lại

.

khớp

(

"c"

,

"abcdef"

< p class = "p">)

# Không trùng khớp

& gt; & gt; & gt;

lại

.

tìm kiếm

(

"^ c"

,

"abcdef"

)

# Không trùng khớp

& gt; & gt; & gt;

lại

.

tìm kiếm

(

"^ a"

,

"abcdef"

)

# Khớp

& lt; re.Match đối tượng; span = (0, 1), match = 'a' & gt;

Tuy nhiên, lưu ý rằng trong MULTILINE mode match () chỉ khớp ở
đầu chuỗi, trong khi sử dụng search () với một biểu thức chính quy
bắt đầu bằng '^' sẽ khớp ở đầu mỗi dòng.

 

& gt; & gt; & gt;

lại

.

khớp

(

'X'

,

'A

\ n

B

\ n

X '< / p>

,

lại

.

MULTILINE

)

# Không trùng khớp

& gt; & gt; & gt;

lại

.

tìm kiếm

(

'^ X'

,

'A

< p class = "se"> \ n

B

\ n

X '

,

lại

.

MULTILINE

)

# Match

& lt; re.Match đối tượng; span = (4, 5), match = 'X' & gt;

Tạo danh bạ

split () chia một chuỗi thành một danh sách được giới hạn bởi mẫu đã qua. Các
phương pháp này là vô giá để chuyển đổi dữ liệu văn bản thành cấu trúc dữ liệu có thể
dễ dàng đọc và sửa đổi bằng Python như được minh họa trong ví dụ sau
tạo một danh bạ.

Đầu tiên, đây là thông tin đầu vào. Thông thường, nó có thể đến từ một tệp, ở đây chúng tôi đang sử dụng
cú pháp chuỗi ba dấu ngoặc kép

 

& gt; & gt; & gt;

text

=

"" "Ross McFluff: 834.345.1254 155 Đường Elm

...

...

Ronald Heathmore: 892.345.3428 436 Finley Avenue

...

Frank Burger: 925.541.7625 662 South Dogwood Way

...

...

...

Heather Albrecht: 548.326.4584 919 Park Place "" "

Các mục nhập được phân tách bằng một hoặc nhiều dòng mới. Bây giờ chúng ta chuyển đổi chuỗi
vào một danh sách với mỗi dòng trống có mục nhập riêng:

 

& gt; & gt; & gt;

mục

=

re

.

chia nhỏ

(

"

\ n

+"

,

text

< p class = "p">)

& gt; & gt; & gt;

mục nhập

['Ross McFluff: 834.345.1254 155 Elm Street',

'Ronald Heathmore: 892.345.3428 436 Finley Avenue',

'Frank Burger: 925.541.7625 662 South Dogwood Way',

'Heather Albrecht: 548.326.4584 919 Park Place']

Cuối cùng, chia từng mục nhập thành một danh sách với họ, tên, số điện thoại
số và địa chỉ. Chúng tôi sử dụng tham số maxsplit của split ()
bởi vì địa chỉ có khoảng trắng, kiểu chia tách của chúng tôi, trong đó:

 

& gt; & gt; & gt;

[

lại

.

chia nhỏ

(

":?"

,

entry

,

3

)

cho

mục nhập

trong

mục nhập

]

[['Ross', 'McFluff', '834.345.1254', '155 Elm Street'],

['Ronald', 'Heathmore', '892.345.3428', '436 Finley Avenue'],

['Frank', 'Burger', '925.541.7625', '662 South Dogwood Way'],

['Heather', 'Albrecht', '548.326.4584', '919 Park Place']]

Mẫu :? khớp với dấu hai chấm sau họ, do đó không
xuất hiện trong danh sách kết quả. Với maxsplit trong tổng số 4 , chúng tôi có thể tách
số nhà từ tên đường:

 

& gt; & gt; & gt;

[

lại

.

chia nhỏ

(

":?"

,

mục nhập

,

4

)

cho

mục nhập

trong

mục nhập

]

[['Ross', 'McFluff', '834.345.1254', '155', 'Elm Street'],

['Ronald', 'Heathmore', '892.345.3428', '436', 'Finley Avenue'],

['Frank', 'Burger', '925.541.7625', '662', 'South Dogwood Way'],

['Heather', 'Albrecht', '548.326.4584', '919', 'Park Place']]

Text Munging

sub () thay thế mọi lần xuất hiện của một mô hình với một chuỗi hoặc
kết quả của một hàm. Ví dụ này minh họa bằng cách sử dụng sub () với
một hàm để "trộn" văn bản hoặc ngẫu nhiên hóa thứ tự của tất cả các ký tự
trong mỗi từ của câu ngoại trừ các ký tự đầu tiên và cuối cùng:

 

& gt; & gt; & gt;

def

repl

(

m

):

...

inner_word

=

danh sách

(

m

.

nhóm

(

2

))

...

ngẫu nhiên

.

xáo trộn

(

inner_word

)

...

trả về

m

.

nhóm

(

1

)

+

""

.

tham gia

(

inner_word

)

+

m

.

nhóm

(

3

)

& gt; & gt; & gt;

text

=

"Giáo sư Abdolmalek, vui lòng báo cáo sự vắng mặt của bạn ngay lập tức." < / p>

& gt; & gt; & gt;

re

.

sub

(

r

"(\ w) (\ w +) (\ w)"

,

repl

,

text

)

'Poefsrosr Aealmlobdk, pslaee reorpt abnseces plmrptoy của bạn.'

& gt; & gt; & gt;

re

.

sub

(

r

"(\ w) (\ w +) (\ w)"

,

repl

,

text

)

'Pofsroser Aodlambelk, plasee reoprt yuor asnebces potlmrpy.'

Tìm tất cả Trạng từ

findall () khớp với tất cả các lần xuất hiện của một mẫu, không chỉ là mẫu đầu tiên
một như search () . Ví dụ, nếu một nhà văn muốn
tìm tất cả các trạng từ trong một số văn bản, họ có thể sử dụng findall () trong
theo cách sau:

 

& gt; & gt; & gt;

text

=

"Anh ta được ngụy trang cẩn thận nhưng bị cảnh sát bắt nhanh chóng."

& gt; & gt; & gt;

re

.

findall

(

r

"\ w + ly \ b"

,

văn bản

)

['cẩn thận', 'nhanh chóng']

Tìm tất cả Trạng từ và Vị trí của chúng

Nếu một người muốn biết thêm thông tin về tất cả các kết quả phù hợp của một mẫu hơn so với mẫu đã khớp
text, finditer () hữu ích vì nó cung cấp < span class = "tham chiếu nội bộ"> đối sánh các đối tượng thay vì các chuỗi. Tiếp tục với ví dụ trước, nếu
một nhà văn muốn tìm tất cả các trạng từ và vị trí của chúng trong
một số văn bản, họ sẽ sử dụng finditer () theo cách sau:

 

& gt; & gt; & gt;

text

=

"Anh ta được ngụy trang cẩn thận nhưng bị cảnh sát bắt nhanh chóng."

& gt; & gt; & gt;

cho

m

in

lại

.

finditer

(

r

" \ w + ly \ b "

,

text

):

...

in

(

'

% 02d

-

% 02d

:

% s

'

%

(

m

.

bắt đầu

(),

m

.

end

(),

m

.

nhóm

(

0

)))

07-16: cẩn thận

40-47: nhanh chóng

Ký hiệu chuỗi thô

Ký hiệu chuỗi thô ( r "text" ) giữ cho các biểu thức chính quy hoạt động tốt. Không có nó,
mọi dấu gạch chéo ngược ( '\' ) trong một biểu thức chính quy sẽ phải được bắt đầu bằng
một cái khác để thoát khỏi nó. Ví dụ: hai dòng mã sau là
giống hệt nhau về mặt chức năng:

 

& gt; & gt; & gt;

lại

.

khớp

(

r

"\ W (.) \ 1 \ W"

,

"ff"

)

& lt; re.Match đối tượng; span = (0, 4), match = 'ff' & gt;

& gt; & gt; & gt;

lại

.

khớp

(

"

\\

W (.)

< p class = "se"> \\

1

\\

W "

,

"ff"

)

& lt; re.Match đối tượng; span = (0, 4), match = 'ff' & gt;

Khi một người muốn khớp với một dấu gạch chéo ngược theo nghĩa đen, nó phải được thoát ra trong
biểu hiện. Với ký hiệu chuỗi thô, điều này có nghĩa là r "\\" . Không có chuỗi thô
ký hiệu, người ta phải sử dụng "\\\\" , tạo các dòng mã sau
giống hệt nhau về mặt chức năng:

 

& gt; & gt; & gt;

lại

.

khớp

(

r

"

\\

"

,

r

"

\\

"

)

& lt; re.Match đối tượng; span = (0, 1), match = '\\' & gt;

& gt; & gt; & gt;

lại

.

khớp

(

"

\\\\

"

,

r

"

\\

"

)

& lt; re.Match đối tượng; span = (0, 1), match = '\\' & gt;

Viết Tokenizer

Một tokenizer hoặc máy quét
phân tích một chuỗi để phân loại các nhóm ký tự. Đây là điều hữu ích đầu tiên
bước viết trình biên dịch hoặc trình thông dịch.

Các danh mục văn bản được chỉ định bằng các biểu thức chính quy. Kỹ thuật là
để kết hợp chúng thành một biểu thức chính quy chính duy nhất và lặp lại
các trận đấu liên tiếp:

 

từ

nhập

nhập

< p class = "n"> NamedTuple

nhập

lại

class

Mã thông báo

(

NamedTuple

):

type

:

str

value

:

str

line

:

int

cột

:

int

def

mã hóa

(

):

từ khóa

=

{

'IF'

,

'THÌ'

,

'ENDIF'

,

'CHO'

,

'NEXT'

,

'GOSUB'

,

'QUAY LẠI'

}

token_specification

=

[

(

'NUMBER'

,

r

'\ d + (\. \ d *)?'

),

# Số nguyên hoặc số thập phân

(

'ASSIGN'

,

r

': ='

),

# Toán tử gán

(

'HẾT'

,

r

';'

),

# Dấu chấm dứt câu lệnh

(

'ID'

,

r

'[A-Za-z] +'

),

# số nhận dạng

(

'OP'

,

r

'[+ \ - * /]'

),

# Toán tử số học

(

'NEWLINE'

,

r

'\ n'

),

# Kết thúc dòng

(

'SKIP'

,

r

'[\ t] +'

),

# Bỏ qua dấu cách và các tab

(

'MISMATCH'

,

r

'.'

),

# Bất kỳ ký tự nào khác

]

tok_regex

=

'|'

.

tham gia

(

'(? p & lt;

% s

& gt;

% s

) '< / p>

%

cặp

cho

cặp

in

token_specification

)

line_num

=

1

line_start

=

0

cho

mo

in

re

.

finditer

(

tok_regex

,

):

kind

=

mo

.

nhóm cuối cùng

giá trị

=

mo

.

nhóm

()

cột

=

mo

.

bắt đầu

()

-

line_start

if

kind

==

'NUMBER '

:

value

=

float

(

value

)

if

' . '

in

value

else

int

(

giá trị

)

elif

kind

==

ID của '

value

in

từ khóa

:

loại

=

giá trị

elif

kind

==

'NEWLINE '

:

line_start

=

mo

.

end

()

line_num

+ =

1

tiếp tục

elif

kind

==

'SKIP '

:

tiếp tục

elif

kind

==

'MISMATCH '

:

raise

RuntimeError

(

f

'

{

giá trị

! r}

đột xuất trên dòng

{

line_num

}

'

)

lợi nhuận

Mã thông báo

(

loại

,

giá trị

,

line_num

,

cột

)

câu lệnh

=

'' '

NẾU số lượng THÌ

tổng: = tổng + giá * số lượng;

thuế: = giá * 0,05;

ENDIF;

'' '

cho

mã thông báo

in

mã thông báo

(

câu lệnh

):

print

(

mã thông báo

)

Tokenizer tạo ra kết quả sau:

 

Mã thông báo

(

loại

< p class = "o"> =

'IF'

,

value < / p>

=

'IF'

,

dòng

=

2

,

cột

=

4

)

Mã thông báo

(

loại

=

'ID'

,

giá trị

=

'số lượng'

,

dòng

=

2

,

cột

< p class = "o"> =

7

)

Mã thông báo

(

loại

=

'THÌ'

,

giá trị

=

'THÌ'

,

dòng

=

2

,

cột

< p class = "o"> =

16

)

Mã thông báo

(

loại

=

'ID'

,

giá trị

=

'tổng'

,

dòng

=

3

,

cột

< p class = "o"> =

8

)

Mã thông báo

(

loại

=

'ASSIGN'

,

giá trị

=

': ='

,

dòng

=

3

,

cột

=

14

)

Mã thông báo

(

loại

=

'ID'

,

giá trị

=

'tổng'

,

dòng

=

3

,

cột

< p class = "o"> =

17

)

Mã thông báo

(

loại

=

'OP'

,

giá trị

=

'+'

,

dòng

=

3

,

cột

< p class = "o"> =

23

)

Mã thông báo

(

loại

=

'ID'

,

giá trị

=

'price'

,

line

=

3

,

cột

< p class = "o"> =

25

)

Mã thông báo

(

loại

=

'OP'

,

giá trị

=

'*'

,

dòng

=

3

,

cột

< p class = "o"> =

31

)

Mã thông báo

(

loại

=

'ID'

,

giá trị

=

'số lượng'

,

dòng

=

3

,

cột

< p class = "o"> =

33

)

Mã thông báo

(

loại

=

'HẾT'

,

giá trị

=

';'

,

dòng

=

3

,

cột

< p class = "o"> =

41

)

Mã thông báo

(

loại

=

'ID'

,

giá trị

=

'thuế'

,

line

=

4

,

cột

< p class = "o"> =

8

)

Mã thông báo

(

loại

=

'ASSIGN'

,

giá trị

=

': ='

,

dòng

=

4

,

cột

=

12

)

Mã thông báo

(

loại

=

'ID'

,

giá trị

=

'price'

,

dòng

=

4

,

cột

=

15

)

Mã thông báo

(

loại

=

'OP'

,

giá trị

=

'*'

,

dòng

=

4

,

cột

< p class = "o"> =

21

)

Mã thông báo

(

loại

=

'NUMBER'

,

giá trị

=

0,05

,

dòng

=

4

,

cột

=

23

)

Mã thông báo

(

loại

=

'HẾT'

,

giá trị

=

';'

,

dòng

=

4

,

cột

< p class = "o"> =

27

)

Mã thông báo

(

loại

=

'ENDIF'

,

giá trị

=

'ENDIF'

,

dòng

=

5

,

cột

< p class = "o"> =

4

)

Mã thông báo

(

loại

=

'HẾT'

,

giá trị

=

';'

,

dòng

=

5

,

cột

< p class = "o"> =

9

)

Frie09

Friedl, Jeffrey. Làm chủ Cụm từ Thông dụng. Xuất bản lần thứ 3, O’Reilly
Media, 2009. Ấn bản thứ ba của cuốn sách không còn đề cập đến Python nữa,
nhưng ấn bản đầu tiên đề cập đến việc viết các mẫu biểu thức chính quy tốt trong
chi tiết tuyệt vời.


Xem thêm những thông tin liên quan đến chủ đề lại chức năng tìm kiếm trong python

Iterators, Iterables, and Itertools in Python || Python Tutorial || Learn Python Programming

  • Tác giả: Socratica
  • Ngày đăng: 2021-09-27
  • Đánh giá: 4 ⭐ ( 8361 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: For-loops in Python do a lot of work for you. By learning HOW iteration works, you will be able to add iteration to your own classes and create custom iterable objects. Python also gives you an "itertools" module which contains a lot of convenience functions to save you time and streamline your code.

    We were able to bring you this video thanks to our generous Kickstarter backers! Find their names hidden (okay, not very hidden) in the video!

    Socratica Friends, we have a quiet little email group for Python if you'd like to receive updates (can't count on YT for notifications). Sign up here: https://snu.socratica.com/python

    ⧓⧓⧓⧓⧓
    Subscribe to Socratica + bell for notifications:
    http://bit.ly/SocraticaSubscribe

    Find our programming playlists here:
    Python programming: http://bit.ly/PythonSocratica
    SQL programming: http://bit.ly/SQL_Socratica

    ⧓⧓⧓⧓⧓
    We recommend:
    How to Be a Great Student
    ebook: https://amzn.to/2Lh3XSP
    Paperback: https://amzn.to/3t5jeH3
    Kindle Unlimited (read free): https://amzn.to/3atr8TJ

    Python Cookbook, 3rd edition
    https://amzn.to/3goRmbG

    The Mythical Man Month - Essays on Software Engineering & Project Management
    http://amzn.to/2tYdNeP

    Shop Amazon Used Textbooks - Save up to 90%
    http://amzn.to/2pllk4B

    ⧓⧓⧓⧓⧓
    Join this channel to get access to perks:
    https://www.youtube.com/channel/UCW6TXMZ5Pq6yL6_k5NZ2e0Q/join

    Support Socratica on Patreon:
    https://www.patreon.com/socratica

    ⧓⧓⧓⧓⧓
    Python instructor: Ulka Simone Mohanty (@ulkam on Twitter)
    Written & Produced by Michael Harrison

    Python Iterators Coding

8 kỹ thuật List trong Python nâng cao nên biết!

  • Tác giả: www.jt1.vn
  • Đánh giá: 5 ⭐ ( 2032 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Nẵm vững các kỹ thuật danh sách trong Python giúp bạn thao tác hiệu quả, chuyên nghiệp hơn với Python. Tìm hiểu ngay nào!!!

Tìm max() min() và cách tính tổng các phần tử trong list Python

  • Tác giả: laptrinhcanban.com
  • Đánh giá: 3 ⭐ ( 8048 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Hướng dẫn cách tìm max min và cách tính tổng các phần tử trong list Python. Bạn sẽ học được cách tìm max() trong list python, tìm min() trong list python và cách tìm top n phần tử lớn nhất hoặc nhỏ

Hàm trong Python

  • Tác giả: toidicode.com
  • Đánh giá: 5 ⭐ ( 2317 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Thực sự thì về khái niệm của hàm thì nó cũng rất khó có thể giải thích được, ở đây mình sẽ tóm lại bằng một khái niệm đơn giản như sau: Hàm là một tập các khối code được viết ra nhằm cho việc tái sử dụng code.Nếu như bạn thấy khó hiểu, thì bạn hãy tưởng tượng như bạn có một đoạn code tính tổng 2 số chẳng hạn, nếu như ở một vị trí khác bạn cũng cần tính tổng 2 số thì bạn lại phải viết lại đoạn c

Tìm kiếm và thay thế một dòng trong một tệp bằng Python

  • Tác giả: qastack.vn
  • Đánh giá: 4 ⭐ ( 8341 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: [Tìm thấy giải pháp!] Tôi đoán một cái gì đó như thế này nên làm điều đó. Về cơ bản,…

Python - Thuật toán tìm kiếm

  • Tác giả: isolution.pro
  • Đánh giá: 5 ⭐ ( 1386 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Tìm kiếm là một nhu cầu rất cơ bản khi bạn lưu trữ dữ liệu trong các cấu trúc dữ liệu khác nhau. Cách thẩm định đơn giản nhất là xem xét mọi phần tử trong cấu trúc dữ liệu và khớp nó với giá trị bạn đang tìm kiếm. Đây được gọi là tìm kiếm tuyến tính. Nó không...

xây dựng chức năng tìm kiếm cho website | Vicogroup.vn

  • Tác giả: vicogroup.vn
  • Đánh giá: 3 ⭐ ( 7709 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Trong bài này tôi sẽ hướng dẫn các bạn cách xây dựng một chức năng tìm kiếm kì đơn giản, đây được xem là chức năng mà đa số website nào cũng cần phải có.

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình

Xem Thêm  Lớp trừu tượng và các phương thức trừu tượng trong C # - phương thức trừu tượng trong c # là gì