Python 3 - Biểu thức chính quy
Một biểu thức chính quy là một chuỗi đặc biệt của nhân vật giúp bạn kết hợp hoặc tìm chuỗi khác hoặc bộ dây, sử dụng một cú pháp đặc biệt được tổ chức tại một mô hình. Biểu thức chính quy được sử dụng rộng rãi trong thế giới UNIX.
Mô-đun recung cấp hỗ trợ đầy đủ cho các biểu thức chính quy giống Perl trong Python. Cácre mô-đun tăng ngoại lệ re.error nếu lỗi xảy ra khi biên dịch hoặc sử dụng biểu thức chính quy.
Chúng tôi sẽ đề cập đến hai hàm quan trọng, sẽ được sử dụng để xử lý các biểu thức chính quy. Tuy nhiên, một điều nhỏ trước tiên: Có nhiều ký tự khác nhau, sẽ có ý nghĩa đặc biệt khi chúng được sử dụng trong biểu thức chính quy. Để tránh bất kỳ sự nhầm lẫn nào trong khi xử lý các biểu thức chính quy, chúng tôi sẽ sử dụng Chuỗi thô nhưr'expression'.
Các mẫu cơ bản khớp với các ký tự đơn
Sr.No. | Biểu thức & Kết hợp |
---|---|
1 | a, X, 9, < nhân vật bình thường chỉ khớp chính xác với chính họ. |
2 | . (a period) khớp với bất kỳ ký tự đơn nào ngoại trừ dòng mới '\ n' |
3 | \w khớp với một ký tự "từ": một chữ cái hoặc chữ số hoặc gạch dưới [a-zA-Z0-9_]. |
4 | \W khớp với bất kỳ ký tự không phải từ nào. |
5 | \b ranh giới giữa từ và không từ |
6 | \s khớp với một ký tự khoảng trắng duy nhất - dấu cách, dòng mới, trả về, tab |
7 | \S khớp với bất kỳ ký tự không có khoảng trắng nào. |
số 8 | \t, \n, \r tab, dòng mới, trở lại |
9 | \d chữ số thập phân [0-9] |
10 | ^ khớp với phần đầu của chuỗi |
11 | $ khớp với phần cuối của chuỗi |
12 | \ ức chế sự "đặc biệt" của một nhân vật. |
Cờ tổng hợp
Cờ tổng hợp cho phép bạn sửa đổi một số khía cạnh về cách hoạt động của biểu thức chính quy. Cờ có sẵn trong mô-đun lại dưới hai tên, một tên dài chẳng hạn nhưIGNORECASE và dạng ngắn, một chữ cái, chẳng hạn như I.
Sr.No. | Cờ & Ý nghĩa |
---|---|
1 | ASCII, A Làm cho một số thoát như \ w, \ b, \ s và \ d chỉ khớp trên các ký tự ASCII với thuộc tính tương ứng. |
2 | DOTALL, S Tạo, khớp bất kỳ ký tự nào, kể cả dòng mới |
3 | IGNORECASE, I Thực hiện đối sánh không phân biệt chữ hoa chữ thường |
4 | LOCALE, L Thực hiện một trận đấu nhận biết ngôn ngữ |
5 | MULTILINE, M Đối sánh nhiều dòng, ảnh hưởng đến ^ và $ |
6 | VERBOSE, X (for ‘extended’) Bật RE dài dòng, có thể được sắp xếp gọn gàng và dễ hiểu hơn |
Chức năng đối sánh
Hàm này cố gắng khớp mẫu RE thành chuỗi với các cờ tùy chọn .
Đây là cú pháp cho hàm này:
re.match(pattern, string, flags = 0)
Đây là mô tả của các tham số -
Sr.No. | Mô tả về Thông Số |
---|---|
1 | pattern Đây là biểu thức chính quy được so khớp. |
2 | string Đây là chuỗi, sẽ được tìm kiếm để khớp với mẫu ở đầu chuỗi. |
3 | flags Bạn có thể chỉ định các cờ khác nhau bằng cách sử dụng bitwise OR (|). Đây là những bổ ngữ, được liệt kê trong bảng dưới đây. |
Hàm re.match trả về mộtmatch đối tượng về sự thành công, Nonevề thất bại. Chúng tôi sử dụng hàm nhóm (num) hoặc nhóm () củamatch đối tượng để có được biểu thức phù hợp.
Sr.No. | Đối sánh Phương pháp & Mô tả |
---|---|
1 | group(num = 0) Phương thức này trả về toàn bộ đối sánh (hoặc số nhóm con cụ thể) |
2 | groups() Phương thức này trả về tất cả các nhóm con phù hợp trong một bộ (trống nếu không có bất kỳ nhóm nào) |
Thí dụ
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print ("matchObj.group() : ", matchObj.group())
print ("matchObj.group(1) : ", matchObj.group(1))
print ("matchObj.group(2) : ", matchObj.group(2))
else:
print ("No match!!")
Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
Chức năng tìm kiếm
Hàm này tìm kiếm lần xuất hiện đầu tiên của mẫu RE trong chuỗi với các cờ tùy chọn .
Đây là cú pháp cho hàm này:
re.search(pattern, string, flags = 0)
Đây là mô tả của các tham số -
Sr.No. | Mô tả về Thông Số |
---|---|
1 | pattern Đây là biểu thức chính quy được so khớp. |
2 | string Đây là chuỗi, sẽ được tìm kiếm để khớp với mẫu ở bất kỳ đâu trong chuỗi. |
3 | flags Bạn có thể chỉ định các cờ khác nhau bằng cách sử dụng bitwise OR (|). Đây là những bổ ngữ, được liệt kê trong bảng dưới đây. |
Hàm re.search trả về mộtmatch đối tượng về sự thành công, nonevề thất bại. Chúng tôi sử dụng hàm nhóm (num) hoặc nhóm () củamatch đối tượng để nhận được biểu thức phù hợp.
Sr.No. | Đối sánh Phương pháp & Mô tả |
---|---|
1 | group(num = 0) Phương thức này trả về toàn bộ đối sánh (hoặc số nhóm con cụ thể) |
2 | groups() Phương thức này trả về tất cả các nhóm con phù hợp trong một bộ (trống nếu không có bất kỳ nhóm nào) |
Thí dụ
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print ("searchObj.group() : ", searchObj.group())
print ("searchObj.group(1) : ", searchObj.group(1))
print ("searchObj.group(2) : ", searchObj.group(2))
else:
print ("Nothing found!!")
Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
Tìm kiếm so khớp với tìm kiếm
Python cung cấp hai hoạt động nguyên thủy khác nhau dựa trên biểu thức chính quy: match chỉ kiểm tra kết quả khớp ở đầu chuỗi, trong khi search kiểm tra kết quả khớp ở bất kỳ đâu trong chuỗi (đây là những gì Perl làm theo mặc định).
Thí dụ
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print ("match --> matchObj.group() : ", matchObj.group())
else:
print ("No match!!")
searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
print ("search --> searchObj.group() : ", searchObj.group())
else:
print ("Nothing found!!")
Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:
No match!!
search --> matchObj.group() : dogs
Tìm kiếm và Thay thế
Một trong những điều quan trọng nhất re các phương thức sử dụng biểu thức chính quy là sub.
Cú pháp
re.sub(pattern, repl, string, max=0)
Phương thức này thay thế tất cả các lần xuất hiện của mẫu RE trong chuỗi bằng repl , thay thế tất cả các lần xuất hiện trừ khi có giá trị max . Phương thức này trả về chuỗi đã sửa đổi.
Thí dụ
#!/usr/bin/python3
import re
phone = "2004-959-559 # This is Phone Number"
# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print ("Phone Num : ", num)
# Remove anything other than digits
num = re.sub(r'\D', "", phone)
print ("Phone Num : ", num)
Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:
Phone Num : 2004-959-559
Phone Num : 2004959559
Công cụ sửa đổi biểu thức chính quy: Cờ tùy chọn
Các ký tự biểu thức chính quy có thể bao gồm một công cụ sửa đổi tùy chọn để kiểm soát các khía cạnh khác nhau của đối sánh. Các bổ ngữ được chỉ định dưới dạng cờ tùy chọn. Bạn có thể cung cấp nhiều công cụ sửa đổi bằng cách sử dụng OR (|) độc quyền, như được hiển thị trước đó và có thể được đại diện bởi một trong những công cụ này -
Sr.No. | Công cụ sửa đổi & mô tả |
---|---|
1 | re.I Thực hiện đối sánh không phân biệt chữ hoa chữ thường. |
2 | re.L Phiên dịch các từ theo ngôn ngữ hiện tại. Cách diễn giải này ảnh hưởng đến nhóm chữ cái (\ w và \ W), cũng như hành vi ranh giới từ (\ b và \ B). |
3 | re.M Làm cho $ khớp với phần cuối của một dòng (không chỉ phần cuối của chuỗi) và làm cho ^ khớp với phần đầu của bất kỳ dòng nào (không chỉ phần đầu của chuỗi). |
4 | re.S Tạo dấu chấm (dấu chấm) khớp với bất kỳ ký tự nào, kể cả dòng mới. |
5 | re.U Phiên dịch các chữ cái theo bộ ký tự Unicode. Cờ này ảnh hưởng đến hoạt động của \ w, \ W, \ b, \ B. |
6 | re.X Cho phép cú pháp biểu thức chính quy "dễ thương hơn". Nó bỏ qua khoảng trắng (ngoại trừ bên trong một tập hợp [] hoặc khi thoát ra bởi dấu gạch chéo ngược) và coi # không thoát như một điểm đánh dấu nhận xét. |
Mẫu biểu thức chính quy
Ngoại trừ các ký tự điều khiển, (+ ? . * ^ $ ( ) [ ] { } | \), tất cả các ký tự đều khớp với nhau. Bạn có thể thoát một ký tự điều khiển bằng cách đặt trước nó một dấu gạch chéo ngược.
Bảng sau liệt kê cú pháp biểu thức chính quy có sẵn trong Python:
Sr.No. | Mô tả về Thông Số |
---|---|
1 | ^ Đối sánh đầu dòng. |
2 | $ Đối sánh với cuối dòng. |
3 | . Khớp với bất kỳ ký tự đơn nào ngoại trừ dòng mới. Sử dụng tùy chọn m cũng cho phép nó khớp với dòng mới. |
4 | [...] Khớp bất kỳ ký tự đơn nào trong ngoặc. |
5 | [^...] Đối sánh bất kỳ ký tự đơn nào không có trong dấu ngoặc |
6 | re* Khớp với 0 hoặc nhiều lần xuất hiện của biểu thức trước. |
7 | re+ Khớp với 1 hoặc nhiều lần xuất hiện của biểu thức trước. |
số 8 | re? Khớp với 0 hoặc 1 lần xuất hiện của biểu thức trước. |
9 | re{ n} Khớp chính xác n số lần xuất hiện của biểu thức trước. |
10 | re{ n,} Khớp với n hoặc nhiều lần xuất hiện của biểu thức trước. |
11 | re{ n, m} Khớp ít nhất n và nhiều nhất m lần xuất hiện của biểu thức trước. |
12 | a|b Đối sánh với a hoặc b. |
13 | (re) Nhóm các biểu thức chính quy và ghi nhớ văn bản phù hợp. |
14 | (?imx) Tạm thời bật tắt các tùy chọn i, m hoặc x trong một biểu thức chính quy. Nếu trong ngoặc đơn, chỉ vùng đó bị ảnh hưởng. |
15 | (?-imx) Tạm thời tắt các tùy chọn i, m hoặc x trong một biểu thức chính quy. Nếu trong ngoặc đơn, chỉ vùng đó bị ảnh hưởng. |
16 | (?: re) Nhóm các biểu thức chính quy mà không cần nhớ văn bản phù hợp. |
17 | (?imx: re) Tạm thời bật tắt các tùy chọn i, m hoặc x trong dấu ngoặc đơn. |
18 | (?-imx: re) Tạm thời tắt các tùy chọn i, m hoặc x trong dấu ngoặc đơn. |
19 | (?#...) Bình luận. |
20 | (?= re) Chỉ định vị trí bằng cách sử dụng một mẫu. Không có phạm vi. |
21 | (?! re) Chỉ định vị trí bằng cách sử dụng phủ định mẫu. Không có phạm vi. |
22 | (?> re) Khớp với mẫu độc lập mà không cần bẻ khóa ngược. |
23 | \w Khớp các ký tự từ. |
24 | \W Đối sánh các ký tự không phải từ khóa. |
25 | \s Khớp khoảng trắng. Tương đương với [\ t \ n \ r \ f]. |
26 | \S Khớp với khoảng trắng. |
27 | \d Khớp các chữ số. Tương đương với [0-9]. |
28 | \D Phù hợp với nondigits. |
29 | \A Đối sánh với phần đầu của chuỗi. |
30 | \Z Đối sánh với cuối chuỗi. Nếu một dòng mới tồn tại, nó sẽ khớp ngay trước dòng mới. |
31 | \z Đối sánh với cuối chuỗi. |
32 | \G Các trận đấu chỉ kết thúc trận đấu cuối cùng. |
33 | \b Khớp các ranh giới từ khi nằm ngoài dấu ngoặc. Khớp với khoảng trắng lùi (0x08) khi bên trong dấu ngoặc. |
34 | \B Khớp các ranh giới không phải từ. |
35 | \n, \t, etc. Khớp với dòng mới, dấu xuống dòng, tab, v.v. |
36 | \1...\9 Đối sánh biểu thức con được nhóm thứ n. |
37 | \10 Đối sánh biểu thức con được nhóm thứ n nếu nó đã khớp. Mặt khác đề cập đến biểu diễn bát phân của mã ký tự. |
Ví dụ về Cụm từ Thông dụng
Ký tự chữ
Sr.No. | Ví dụ & Mô tả |
---|---|
1 | python Ghép "con trăn". |
Các lớp nhân vật
Sr.No. | Ví dụ & Mô tả |
---|---|
1 | [Pp]ython Khớp "Python" hoặc "python" |
2 | rub[ye] Khớp "ruby" hoặc "rube" |
3 | [aeiou] Khớp với bất kỳ một nguyên âm chữ thường nào |
4 | [0-9] Khớp với bất kỳ chữ số nào; giống với [0123456789] |
5 | [a-z] Khớp với bất kỳ ký tự ASCII viết thường nào |
6 | [A-Z] Khớp với bất kỳ ký tự ASCII viết hoa nào |
7 | [a-zA-Z0-9] Phù hợp với bất kỳ điều nào ở trên |
số 8 | [^aeiou] Khớp bất kỳ thứ gì khác ngoài một nguyên âm viết thường |
9 | [^0-9] Khớp bất kỳ thứ gì khác ngoài một chữ số |
Các lớp nhân vật đặc biệt
Sr.No. | Ví dụ & Mô tả |
---|---|
1 | . Khớp bất kỳ ký tự nào ngoại trừ dòng mới |
2 | \d Khớp một chữ số: [0-9] |
3 | \D Khớp với một nondigit: [^ 0-9] |
4 | \s Khớp một ký tự khoảng trắng: [\ t \ r \ n \ f] |
5 | \S Khớp với khoảng trắng: [^ \ t \ r \ n \ f] |
6 | \w Khớp một ký tự từ đơn: [A-Za-z0-9_] |
7 | \W Khớp một ký tự không phải từ khóa: [^ A-Za-z0-9_] |
Các trường hợp lặp lại
Sr.No. | Ví dụ & Mô tả |
---|---|
1 | ruby? Đối sánh "rub" hoặc "ruby": y là tùy chọn |
2 | ruby* Khớp "chà" cộng với 0 hoặc nhiều y |
3 | ruby+ Khớp "chà" cộng với 1 hoặc nhiều y |
4 | \d{3} Khớp chính xác 3 chữ số |
5 | \d{3,} Khớp 3 chữ số trở lên |
6 | \d{3,5} Khớp 3, 4 hoặc 5 chữ số |
Sự lặp lại nông cạn
Điều này phù hợp với số lần lặp lại nhỏ nhất -
Sr.No. | Ví dụ & Mô tả |
---|---|
1 | <.*> Lặp lại tham lam: khớp với "<python> perl>" |
2 | <.*?> Nongreedy: đối sánh "<python>" trong "<python> perl>" |
Phân nhóm bằng dấu ngoặc đơn
Sr.No. | Ví dụ & Mô tả |
---|---|
1 | \D\d+ Không có nhóm: + lặp lại \ d |
2 | (\D\d)+ Đã nhóm: + lặp lại cặp \ D \ d |
3 | ([Pp]ython(,)?)+ Khớp "Python", "Python, python, python", v.v. |
Tài liệu tham khảo
Điều này khớp lại với một nhóm đã khớp trước đó -
Sr.No. | Ví dụ & Mô tả |
---|---|
1 | ([Pp])ython&\1ails Khớp với python & pails hoặc Python & Pails |
2 | (['"])[^\1]*\1 Chuỗi được trích dẫn đơn hoặc kép. \ 1 đối sánh với bất kỳ thứ gì mà nhóm đầu tiên phù hợp. \ 2 đối sánh với bất kỳ thứ gì mà nhóm thứ hai phù hợp, v.v. |
Giải pháp thay thế
Sr.No. | Ví dụ & Mô tả |
---|---|
1 | python|perl Khớp "python" hoặc "perl" |
2 | rub(y|le) Khớp "ruby" hoặc "rúp" |
3 | Python(!+|\?) "Python" được theo sau bởi một hoặc nhiều! hay một cái? |
Mỏ neo
Điều này cần phải chỉ định vị trí khớp.
Sr.No. | Ví dụ & Mô tả |
---|---|
1 | ^Python Khớp "Python" ở đầu chuỗi hoặc dòng nội bộ |
2 | Python$ Khớp "Python" ở cuối chuỗi hoặc dòng |
3 | \APython Khớp "Python" ở đầu chuỗi |
4 | Python\Z Khớp "Python" ở cuối chuỗi |
5 | \bPython\b Khớp "Python" ở một ranh giới từ |
6 | \brub\B \ B là ranh giới không có từ khóa: đối sánh "rub" trong "rube" và "ruby" nhưng không đối sánh một mình |
7 | Python(?=!) Khớp "Python", nếu theo sau là dấu chấm than. |
số 8 | Python(?!!) Khớp "Python", nếu không có dấu chấm than theo sau. |
Cú pháp đặc biệt với dấu ngoặc đơn
Sr.No. | Ví dụ & Mô tả |
---|---|
1 | R(?#comment) Đối sánh với "R". Tất cả phần còn lại là bình luận |
2 | R(?i)uby Không phân biệt chữ hoa chữ thường khi đối sánh "uby" |
3 | R(?i:uby) Giống như trên |
4 | rub(?:y|le)) Chỉ nhóm mà không tạo \ 1 backreference |