Nhóm đối sánh Python

Cách sử dụng các hàm biểu thức chính quy do thư viện 're' cung cấp để khớp, tìm kiếm và thay thế văn bản trong các chương trình Python của bạn

  • Nhóm đối sánh Python
  • Nhóm đối sánh Python
  • Nhóm đối sánh Python
  • Nhóm đối sánh Python
  • Nhóm đối sánh Python
  • Nhóm đối sánh Python

Nhóm đối sánh Python
Bởi Serdar Yegulalp

Nhà văn cao cấp, InfoWorld.

Nhóm đối sánh Python
David Lofink (CC BY 2. 0)

Biểu thức chính quy hoặc “regex” là một hệ thống tìm các mẫu phức tạp trong văn bản. Hầu hết mọi ngôn ngữ chính đều có hỗ trợ cho các biểu thức chính quy, dù là thư viện bổ trợ hay chức năng thư viện gốc

Python đi kèm với hỗ trợ regex ngay lập tức, như một phần của thư viện chuẩn của nó. Tại đây, chúng ta sẽ xem nhanh thư viện biểu thức chính quy của Python và cách tận dụng tối đa thư viện này. Để biết thêm chi tiết về biểu thức chính quy nói chung, hãy xem phần giới thiệu này trong tài liệu Python

[ Theo dõi các video hướng dẫn về Python thông minh của Serdar Yegulalp để tìm hiểu các thủ thuật Python thông minh trong 5 phút hoặc ít hơn ]

Khái niệm cơ bản về regex Python

Để bắt đầu sử dụng biểu thức chính quy trong Python, chỉ cần nhập thư viện biểu thức chính quy Python, 

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
4, được đưa vào như một phần của thư viện chuẩn của Python

import re

Cách dễ nhất để sử dụng 

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
4 là thực hiện các tìm kiếm nhanh chóng, sử dụng một biểu thức chính quy cụ thể đối với một chuỗi cụ thể. Đây là một ví dụ dễ dàng

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])

Ở đây, chúng tôi sử dụng biểu thức chính quy _______56, tìm kiếm chữ cái

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
7 theo sau là bất kỳ số chữ số nào và sau đó là khoảng trắng.
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
0 lấy biểu thức chính quy đó và tìm kiếm kết quả khớp đầu tiên với biểu thức đó trong chuỗi được cung cấp 
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
1. Trong ví dụ trên, trận đấu là 
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
2

Khi 

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
4 thực hiện một hoặc nhiều kết quả khớp, nó sẽ trả về cái được gọi là đối tượng khớp, là cấu trúc dữ liệu chứa nhiều thông tin chi tiết về kết quả trùng khớp. (Thông tin thêm về khớp các đối tượng trong một chút. )

Hầu hết thời gian, nếu bạn chỉ tìm kiếm kết quả phù hợp đầu tiên, thì bạn có thể lấy nó chỉ bằng cách lập chỉ mục vào đối tượng khớp như chúng tôi đã thực hiện ở trên (với chỉ mục 

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
4)

Cuối cùng, lưu ý rằng chúng tôi đã sử dụng chuỗi thô Python để xây dựng biểu thức chính quy của mình. Điều này là do cú pháp của biểu thức chính quy, vì nó sử dụng dấu gạch chéo ngược, có thể xung đột với cách thoát chuỗi thông thường trong Python. Tiền tố 

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
5 trước chuỗi cho trình thông dịch Python biết, “Không hiểu dấu gạch chéo ngược là mã thoát. ”

Nhiều cách khác để khớp bằng Python regex

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
0 không phải là cách duy nhất để tìm các mẫu trong văn bản với 
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
4 và đây không phải là cách linh hoạt nhất. Bốn phương pháp khác có sẵn trong 
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
4 có thể phù hợp hơn với trường hợp sử dụng của bạn

  • import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    9 giống như 
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    0, nhưng chỉ tìm các kết quả khớp từ đầu chuỗi và không tìm ở đâu khác. Điều này hữu ích nếu bạn biết mình sẽ không quét phần còn lại của chuỗi và bạn muốn tối ưu hóa phương thức so khớp
  • import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    01 cố gắng đối sánh biểu thức chính quy với toàn bộ chuỗi và chỉ toàn bộ chuỗi. Một lần nữa, điều này tối ưu hóa chiến lược đối sánh trong trường hợp bạn muốn đối sánh tất cả hoặc không có gì
  • import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    02 tìm kiếm tất cả các kết quả phù hợp có sẵn và trả về chúng ở dạng trình tạo. Mỗi lần lặp lại của trình tạo tạo ra một đối tượng khớp, một đối tượng cho mỗi kết quả tìm thấy. Điều này hữu ích nếu bạn đang làm việc với một chuỗi lớn có thể mang lại nhiều kết quả phù hợp và bạn muốn tiết kiệm bộ nhớ bằng cách tạo và sử dụng một đối tượng phù hợp tại một thời điểm
  • import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    03 tìm kiếm tất cả các kết quả phù hợp, chẳng hạn như 
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    02, nhưng trả về các kết quả phù hợp dưới dạng một danh sách đơn giản. Nếu bạn không muốn bận tâm đến tất cả các chi tiết khi làm việc với các đối tượng khớp, thì bạn chỉ cần sử dụng 
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    03 để tạo danh sách Python gồm tất cả các kết quả khớp được tìm thấy. Nhược điểm là danh sách được tạo tất cả cùng một lúc, không tăng dần, do đó có thể không lý tưởng cho các chuỗi lớn tạo ra nhiều kết quả phù hợp

Nếu bạn đang tìm kiếm một trận đấu duy nhất,

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
9 và
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
01 cung cấp cho bạn hai tùy chọn hữu ích. Nếu biểu thức chính quy của bạn có khả năng tạo ra nhiều kết quả phù hợp, thì
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
02 và
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
09 sẽ cung cấp cho bạn hai cách khác nhau để sử dụng kết quả. Đây là một ví dụ sử dụng
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
02

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
0

Biểu thức chính quy sử dụng nhiều ký tự theo cách dành riêng cho cú pháp biểu thức chính quy, chẳng hạn như dấu chấm (

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
11) hoặc dấu ngoặc nhọn (
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
12 và 
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
13). Nếu bạn muốn tìm kiếm những ký tự đó, bạn sẽ cần thoát chúng bằng dấu gạch chéo ngược trong biểu thức của mình. Nhưng nếu bạn đang làm việc với đầu vào tùy ý mà bạn muốn thoát tự động — ví dụ: bằng cách tìm kiếm một số đầu vào của người dùng — bạn có thể sử dụng 
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
14 để chuyển đổi một chuỗi thành phiên bản thoát biểu thức chính quy của nó

Tìm kiếm và thay thế bằng Python regex

Biểu thức chính quy cũng có thể được sử dụng để thực hiện các thao tác tìm kiếm và thay thế, với 

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
15. Đây là một ví dụ

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
1

Regex này thay thế tất cả các lần xuất hiện của 

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
7 theo sau là bất kỳ số chữ số nào và sau đó là khoảng trắng bằng
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
17, theo sau là các chữ số đó và dấu cách

Lưu ý rằng tìm kiếm và thay thế thường sử dụng một số tính năng đặc biệt trong biểu thức chính quy. Phần ngoặc đơn của biểu thức chính quy được gọi là "nhóm chụp", đây là một cách để chọn ra và tham chiếu đến các phần của kết quả khớp. Chuỗi thay thế, 

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
18, sử dụng 
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
19 để chỉ nhóm chụp đầu tiên trong biểu thức so khớp — về cơ bản là nói: “Chèn nội dung của nhóm chụp đó vào đây. ”

Khớp các đối tượng trong Python regex

Các đối tượng đối sánh chứa thông tin về một đối sánh biểu thức chính quy cụ thể — vị trí trong chuỗi nơi tìm thấy đối sánh, nội dung của bất kỳ nhóm chụp nào đối với đối sánh, v.v. Bạn có thể làm việc với các đối tượng khớp bằng các phương thức này

  • import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    00 trả về kết quả khớp từ chuỗi. Đây sẽ là
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    01 trong ví dụ đầu tiên của chúng tôi
  • import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    02 và 
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    03 trả về chỉ số bắt đầu và kết thúc của trận đấu. Chúng giống như các chỉ mục bắt đầu và kết thúc của một lát Python, vì vậy bạn có thể sử dụng chúng cho mục đích chính xác nếu cần. Nếu bạn muốn cả hai cùng một lúc trong một bộ, bạn có thể sử dụng
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    04
  • import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    05 trả về các nhóm chụp được tìm thấy trong một trận đấu. Nhóm chụp cho phép bạn sử dụng dấu ngoặc đơn để chỉ ra các phần khác nhau của trận đấu.
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    00 hoặc 
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    07 trả về toàn bộ kết quả phù hợp,
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    08 trả về nhóm chụp đầu tiên, tổ hợp các đối số (
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    09) tạo ra một bộ có nội dung của các nhóm chụp được liệt kê và
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    00 tạo ra tất cả các nhóm chụp trong một bộ duy nhất
  • import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    01 trả về từ điển các nhóm chụp được đặt tên. Thông thường, các nhóm chụp được gọi bằng một chỉ mục, nhưng bạn có thể gán tên cho chúng nếu muốn.
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    01 cho phép bạn tham khảo các nhóm chụp đó theo tên, giống như nội dung của bất kỳ từ điển nào khác

Tùy chọn biểu thức chính quy Python

Khi tạo regex Python, bạn có thể chuyển một số tùy chọn kiểm soát hành vi của nó. Dưới đây là một số hữu ích nhất

  • import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    03 thực hiện so khớp không phân biệt chữ hoa chữ thường trong suốt biểu thức chính quy. Thông thường biểu thức chính quy phân biệt chữ hoa chữ thường, nhưng nếu bạn không muốn mã hóa phân biệt chữ hoa chữ thường theo cách thủ công vào biểu thức so khớp của mình, bạn có thể sử dụng tùy chọn này thay thế
  • import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    04 thay đổi cách biểu thức chính quy xử lý mã thông báo cho phần đầu và phần cuối của chuỗi (lần lượt là
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    05 và 
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    06). Khi được bật, các mã thông báo đó cũng khớp với phần đầu và phần cuối của dòng trong chuỗi. Nếu bạn đang xử lý văn bản kéo dài trên nhiều dòng và bạn muốn biết các dấu ngắt dòng trong biểu thức chính quy của mình, hãy sử dụng tùy chọn này
  • import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    07 thay đổi cách ký tự dấu chấm (
    import re
    text = 'b213 a13 x15'
    print (re.search(r'a\d*\W', text)[0])
    11) trong biểu thức chính quy khớp với văn bản. Khi được bật, dấu chấm không chỉ khớp với tất cả các ký tự văn bản mà cả các dòng mới

Dưới đây là một ví dụ về cách các tùy chọn này có thể được sử dụng. Lưu ý rằng các tùy chọn này về cơ bản là các giá trị, vì vậy chúng được chuyển bằng cách kết hợp chúng với toán tử logic “và” (

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
09)

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
0

Biên dịch trước các regex Python

Nếu bạn đang thực hiện đối sánh cụm từ thông dụng chỉ một lần trong vòng đời của tập lệnh, thì việc sử dụng 

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
0 hoặc 
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
9 là tốt. Nhưng nếu bạn đang thực hiện nhiều lần khớp trong một tập lệnh hoặc thực hiện nhiều lần khớp trong một vòng lặp, thì sẽ có chi phí hiệu suất liên quan đến việc xác định lặp đi lặp lại các biểu thức chính quy. Trong những trường hợp như thế này, sẽ rất hợp lý khi sử dụng biểu thức chính quy được biên dịch sẵn

Để tạo biểu thức chính quy được biên dịch sẵn, hãy sử dụng 

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
42. Truyền cho nó một chuỗi biểu thức chính quy và bạn sẽ nhận lại một đối tượng mà bạn có thể sử dụng như thể đó là chính đối tượng 
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
4

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
0

Trong ví dụ này, chúng tôi lặp qua một tập hợp các chuỗi để tìm trong mỗi chuỗi một hoặc nhiều lần xuất hiện của chữ cái

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
7 và chữ cái ngay sau nó, sau đó lặp qua tất cả các kết quả khớp trên chuỗi đó cho biểu thức chính quy đó. Bởi vì chúng tôi đang sử dụng cùng một biểu thức chính quy trên mỗi lần lặp lại của vòng lặp, nên chỉ tạo đối tượng biểu thức chính quy một lần và sử dụng lại nó

[ Cũng trên InfoWorld. 5 công cụ để dọn dẹp mã Python của bạn]

Thư viện regex Python

Thư viện

import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
4 có trong thư viện chuẩn của Python không phải là hệ thống biểu thức chính quy duy nhất có sẵn cho Python. Thư viện của bên thứ ba, 
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
46, cung cấp một số chức năng bổ sung. Chẳng hạn,
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
47 có thể thực hiện khớp không phân biệt chữ hoa chữ thường trong Unicode. Tuy nhiên, tính năng quan trọng nhất của nó là có thể chạy đồng thời — nó có thể thực hiện các thao tác so khớp bên ngoài GIL của Python, vì vậy, các thao tác regex không chặn các luồng Python khác. Đối với mục đích sử dụng thông thường, thư viện _______54 thông thường vẫn ổn, nhưng hãy cân nhắc sử dụng 
import re
text = 'b213 a13 x15'
print (re.search(r'a\d*\W', text)[0])
46 nếu bạn thấy mình thực hiện nhiều trận đấu trong các vòng lặp chặt chẽ

Có liên quan

  • con trăn
  • Thư viện và Framework phát triển
  • Công cụ phát triển

Serdar Yegulalp là một nhà văn cao cấp tại InfoWorld, tập trung vào học máy, container hóa, devops, hệ sinh thái Python và đánh giá định kỳ

Nhóm đối sánh () trong Python là gì?

Khớp các đối tượng trong biểu thức chính quy Python . group() trả về kết quả khớp từ chuỗi . Đây sẽ là a15 trong ví dụ đầu tiên của chúng tôi. cuộc thi đấu. bắt đầu() và khớp.

Làm cách nào để sử dụng các nhóm trong regex Python?

Nhóm là một phần của mẫu biểu thức chính quy được đặt trong siêu ký tự dấu ngoặc đơn (). Chúng tôi tạo một nhóm bằng cách đặt mẫu biểu thức chính quy bên trong tập hợp các dấu ngoặc đơn ( và ) . Ví dụ: biểu thức chính quy (con mèo) tạo một nhóm duy nhất chứa các chữ cái 'c', 'a' và 't'.

Regex nhóm đối sánh là gì?

Biểu thức chính quy cho phép chúng ta không chỉ đối sánh văn bản mà còn trích xuất thông tin để xử lý thêm. Điều này được thực hiện bằng cách xác định nhóm ký tự và ghi lại chúng bằng cách sử dụng dấu ngoặc đơn đặc biệt ( và ) siêu ký tự . Bất kỳ mẫu con nào bên trong một cặp dấu ngoặc đơn sẽ được ghi lại dưới dạng một nhóm.

Nhóm tìm kiếm lại Python là gì?

Trong Python, tìm kiếm biểu thức chính quy thường được viết là. khớp = lại. search(pat, str) The re. phương thức search() lấy một mẫu biểu thức chính quy và một chuỗi rồi tìm kiếm mẫu đó trong chuỗi . Nếu tìm kiếm thành công, search() trả về một đối tượng khớp hoặc Không có gì khác.