Bạn đang xem : Ví dụ về chuỗi python regex

Tài liệu này là hướng dẫn giới thiệu về cách sử dụng biểu thức chính quy trong Python với mô-đun re. Nó cung cấp phần giới thiệu nhẹ nhàng hơn so với phần tương ứng trong Tham khảo thư viện.

Ngôn ngữ biểu thức chính quy tương đối nhỏ và bị hạn chế, vì vậy không phải tất cả các tác vụ xử lý chuỗi có thể có đều có thể được thực hiện bằng cách sử dụng biểu thức chính quy. Cũng có những tác vụ có thể được thực hiện với các biểu thức chính quy, nhưng các biểu thức hóa ra lại rất phức tạp. Trong những trường hợp này, bạn nên viết mã Python để thực hiện quá trình xử lý; trong khi mã Python sẽ chậm hơn so với một biểu thức chính quy phức tạp, nó cũng có thể sẽ dễ hiểu hơn.

Các mẫu biểu thức chính quy được biên dịch thành một chuỗi các mã bytecodes sau đó được thực thi bởi một công cụ phù hợp được viết bằng C. For sử dụng nâng cao, có thể cần phải chú ý cẩn thận đến cách động cơ sẽ thực thi một RE nhất định và viết RE theo một cách nhất định để tạo ra bytecode chạy nhanh hơn. Tài liệu này không đề cập đến tính năng tối ưu hóa vì nó đòi hỏi bạn phải hiểu rõ về nội dung bên trong của công cụ phù hợp.

Biểu thức chính quy (được gọi là RE, hoặc regex, hoặc các mẫu regex) về cơ bản là một ngôn ngữ lập trình chuyên dụng được nhúng bên trong Python và được cung cấp thông qua mô-đun re. Sử dụng ngôn ngữ nhỏ này, bạn chỉ định các quy tắc cho tập hợp các chuỗi có thể có mà bạn muốn khớp; tập hợp này có thể chứa các câu tiếng Anh, địa chỉ e-mail, hoặc lệnh TeX, hoặc bất cứ thứ gì bạn thích. Sau đó, bạn có thể đặt các câu hỏi như “Chuỗi này có khớp với mẫu không?” Hoặc “Có khớp với mẫu ở bất kỳ đâu trong chuỗi này không?”. Bạn cũng có thể sử dụng RE để sửa đổi một chuỗi hoặc để tách chuỗi đó ra theo nhiều cách khác nhau.

Người đọc của một bộ giảm thiểu có thể nhận thấy rằng ba ký hiệu định tính khác đều có thể được thể hiện bằng cách sử dụng ký hiệu này. {0,} giống với *, {1,} tương đương với + và {0,1} giống với? . Tốt hơn là sử dụng *, + hoặc? khi bạn có thể, đơn giản vì chúng ngắn hơn và dễ đọc hơn.

Bạn có thể bỏ qua m hoặc n; trong trường hợp đó, một giá trị hợp lý được giả định cho giá trị còn thiếu. Việc bỏ qua m được hiểu là giới hạn dưới của 0, trong khi bỏ qua n sẽ dẫn đến giới hạn trên của vô hạn.

Định tính lặp lại phức tạp nhất là {m, n}, trong đó m và n là các số nguyên thập phân. Định nghĩa này có nghĩa là phải có ít nhất m lần lặp lại và nhiều nhất là n. Ví dụ: a / {1,3} b sẽ khớp với ‘a / b’, ‘a // b’ và ‘a /// b’. Nó sẽ không khớp với ‘ab’, không có dấu gạch chéo hoặc ‘a //// b’, có bốn.

Có hai từ lặp lại nữa. Kí tự dấu chấm hỏi ,? , khớp một lần hoặc không lần nào; bạn có thể coi nó như là đánh dấu một cái gì đó là tùy chọn. Ví dụ: home-? Brew khớp với “homebrew” hoặc “home-brew”.

Một siêu ký tự lặp lại khác là +, khớp với một hoặc nhiều lần. Hãy chú ý cẩn thận đến sự khác biệt giữa * và +; * đối sánh không hoặc nhiều lần, vì vậy bất kỳ điều gì đang được lặp lại có thể hoàn toàn không xuất hiện, trong khi + yêu cầu ít nhất một lần xuất hiện. Để sử dụng một ví dụ tương tự, ca + t sẽ khớp với ‘cat’ (1 ‘a’), ‘caaat’ (3 ‘a’ s), nhưng sẽ không khớp với ‘ct’.

Phần cuối của RE hiện đã đạt được và nó đã khớp với ‘abcb’. Điều này thể hiện cách mà công cụ so khớp tiến xa nhất có thể lúc đầu và nếu không tìm thấy kết quả phù hợp nào, nó sẽ sao lưu dần dần và thử lại nhiều lần phần còn lại của RE. Nó sẽ sao lưu cho đến khi không thử khớp với [bcd] * và nếu sau đó không thành công, công cụ sẽ kết luận rằng chuỗi hoàn toàn không khớp với RE.

Hãy thử lại b. Lần này ký tự ở vị trí hiện tại là ‘b’, vì vậy nó thành công.

Sao lưu lại để [bcd] * chỉ khớp với bc.

Hãy thử lại b, nhưng vị trí hiện tại nằm ở ký tự cuối cùng, là ‘d’.

Công cụ cố gắng so khớp b, nhưng vị trí hiện tại nằm ở cuối chuỗi, vì vậy nó không thành công.

Công cụ khớp với [bcd] *, đi xa hết mức có thể, đến cuối chuỗi.

Ví dụ từng bước sẽ làm rõ ràng hơn điều này. Hãy xem xét biểu thức a [bcd] * b. Điều này khớp với ký tự ‘a’, không hoặc nhiều ký tự từ lớp [bcd], và cuối cùng kết thúc bằng ‘b’. Bây giờ, hãy tưởng tượng so khớp RE này với chuỗi ‘abcbd’.

Các lặp lại như * là tham lam; khi lặp lại một RE, công cụ khớp sẽ cố gắng lặp lại nó nhiều lần nhất có thể. Nếu các phần sau của mẫu không khớp, công cụ đối sánh sẽ sao lưu và thử lại với ít lần lặp lại hơn.

Ví dụ: ca * t sẽ khớp với ‘ct’ (0 ký tự ‘a’) , ‘cat’ (1 ‘a’), ‘caaat’ (3 ký tự ‘a’), v.v..

Siêu ký tự đầu tiên để lặp lại những thứ mà chúng ta sẽ xem xét là *. * không khớp với ký tự chữ ‘*’; thay vào đó, nó chỉ định rằng ký tự trước đó có thể được so khớp không hoặc nhiều lần, thay vì chính xác một lần.

Việc có thể khớp các nhóm ký tự khác nhau là điều đầu tiên mà biểu thức chính quy có thể làm được. với các phương thức có sẵn trên chuỗi. Tuy nhiên, nếu đó là khả năng bổ sung duy nhất của regexes, thì chúng sẽ không có nhiều tác dụng. Một khả năng khác là bạn có thể chỉ định rằng các phần của RE phải được lặp lại một số lần nhất định.

Siêu ký tự cuối cùng trong phần này là. . Nó khớp với bất kỳ thứ gì ngoại trừ một ký tự dòng mới và có một chế độ thay thế (re.DOTALL) nơi nó sẽ khớp ngay cả với một dòng mới. . thường được sử dụng khi bạn muốn khớp với “bất kỳ ký tự nào”.

Các chuỗi này có thể được đưa vào bên trong một lớp ký tự. Ví dụ: [\ s,] là một lớp ký tự sẽ khớp với bất kỳ ký tự khoảng trắng nào hoặc ‘,’ hoặc ‘.’ .

Danh sách các trình tự đặc biệt sau đây chưa đầy đủ. Để có danh sách đầy đủ các chuỗi và định nghĩa lớp mở rộng cho các mẫu chuỗi Unicode, hãy xem phần cuối của Cú pháp biểu thức chính quy trong tài liệu tham khảo Thư viện Chuẩn. Nói chung, các phiên bản Unicode khớp với bất kỳ ký tự nào trong danh mục thích hợp trong cơ sở dữ liệu Unicode.

Hãy lấy một ví dụ: \ w khớp với bất kỳ ký tự chữ và số nào. Nếu mẫu regex được biểu thị bằng byte, thì nó tương đương với lớp [a-zA-Z0-9_]. Nếu mẫu regex là một chuỗi, \ w sẽ khớp với tất cả các ký tự được đánh dấu là chữ cái trong cơ sở dữ liệu Unicode do mô-đun unicodedata cung cấp. Bạn có thể sử dụng định nghĩa hạn chế hơn của \ w trong mẫu chuỗi bằng cách cung cấp cờ re.ASCII khi biên dịch biểu thức chính quy.

Một số chuỗi đặc biệt bắt đầu bằng ‘\’ đại diện cho các bộ ký tự được xác định trước thường hữu ích, chẳng hạn như tập hợp các chữ số, tập hợp các chữ cái hoặc tập hợp bất kỳ thứ gì không phải là khoảng trắng.

Có lẽ ký tự siêu quan trọng nhất là dấu gạch chéo ngược, \. Như trong các ký tự chuỗi Python, dấu gạch chéo ngược có thể được theo sau bởi các ký tự khác nhau để báo hiệu các chuỗi đặc biệt khác nhau. Nó cũng được sử dụng để thoát khỏi tất cả các siêu ký tự để bạn vẫn có thể đối sánh chúng theo các mẫu; ví dụ: nếu bạn cần đối sánh [hoặc \, bạn có thể đặt trước chúng bằng dấu gạch chéo ngược để loại bỏ ý nghĩa đặc biệt của chúng: \ [hoặc \\.

Bạn có thể so khớp các ký tự không được liệt kê trong lớp bằng bổ sung cho bộ. Điều này được chỉ ra bằng cách bao gồm một ‘^’ làm ký tự đầu tiên của lớp. Ví dụ: [^ 5] sẽ khớp với bất kỳ ký tự nào ngoại trừ ‘5’. Nếu dấu mũ xuất hiện ở nơi khác trong lớp ký tự, nó không có ý nghĩa đặc biệt. Ví dụ: [5 ^] sẽ khớp với ‘5’ hoặc ‘^’.

Các ký tự siêu (ngoại trừ \) không hoạt động bên trong các lớp. Ví dụ: [akm $] sẽ khớp với bất kỳ ký tự nào trong số các ký tự ‘a’, ‘k’, ‘m’ hoặc ‘$’; ‘$’ thường là một siêu ký tự, nhưng bên trong một lớp ký tự, nó bị tước đi tính chất đặc biệt của nó.

Các siêu ký tự đầu tiên chúng ta sẽ xem xét là [và]. Chúng được sử dụng để chỉ định một lớp ký tự, là một tập hợp các ký tự mà bạn muốn đối sánh. Các ký tự có thể được liệt kê riêng lẻ hoặc một loạt các ký tự có thể được chỉ định bằng cách cho hai ký tự và phân tách chúng bằng dấu ‘-‘. Ví dụ, [abc] sẽ khớp với bất kỳ ký tự nào trong số các ký tự a, b hoặc c; điều này giống với [a-c], sử dụng một phạm vi để thể hiện cùng một bộ ký tự. Nếu bạn chỉ muốn đối sánh các chữ cái thường, RE của bạn sẽ là [a-z].

Dưới đây là danh sách đầy đủ các ký tự siêu; ý nghĩa của chúng sẽ được thảo luận trong phần còn lại của HOWTO này.

Có những ngoại lệ đối với quy tắc này; một số ký tự là ký tự siêu đặc biệt và không khớp với chính chúng. Thay vào đó, chúng báo hiệu rằng một số điều khác thường nên được ghép nối hoặc chúng ảnh hưởng đến các phần khác của RE bằng cách lặp lại chúng hoặc thay đổi ý nghĩa của chúng. Phần lớn tài liệu này dành để thảo luận về các siêu ký tự khác nhau và công việc của chúng.

Hầu hết các chữ cái và ký tự sẽ đơn giản khớp với chính chúng. Ví dụ: kiểm tra biểu thức chính quy sẽ khớp chính xác với kiểm tra chuỗi. (Bạn có thể bật chế độ không phân biệt chữ hoa chữ thường để cho phép RE này khớp với Test hoặc TEST; tìm hiểu thêm về điều này sau.)

Để có giải thích chi tiết về cụm từ thông dụng cơ bản trong khoa học máy tính (xác định và không tự động hữu hạn xác định), bạn có thể tham khảo hầu hết mọi sách giáo khoa về viết trình biên dịch.

Chúng ta sẽ bắt đầu bằng cách tìm hiểu về các biểu thức chính quy đơn giản nhất có thể. Vì các biểu thức chính quy được sử dụng để hoạt động trên các chuỗi, chúng ta sẽ bắt đầu với tác vụ phổ biến nhất: khớp các ký tự.

Trong ví dụ trên, việc ghép tự động các ký tự chuỗi của Python đã được sử dụng để chia RE thành các phần nhỏ hơn, nhưng vẫn khó hiểu hơn so với phiên bản sử dụng re.VERBOSE.

Nếu không có cài đặt chi tiết, RE sẽ trông giống như sau:

Ví dụ: đây là RE sử dụng re.VERBOSE; xem nó dễ đọc hơn bao nhiêu?

Xem Thêm  Blog là gì? Hướng dẫn tạo Blog cá nhân miễn phí - tắt chức năng comment trong wordpress

Cờ này cho phép bạn viết các biểu thức chính quy dễ đọc hơn bằng cách cho phép bạn linh hoạt hơn trong cách bạn có thể định dạng chúng. Khi cờ này đã được chỉ định, khoảng trắng trong chuỗi RE sẽ bị bỏ qua, ngoại trừ khi khoảng trắng nằm trong một lớp ký tự hoặc đứng trước dấu gạch chéo ngược không thoát; điều này cho phép bạn sắp xếp và thụt lề RE rõ ràng hơn. Cờ này cũng cho phép bạn đặt các nhận xét trong RE sẽ bị công cụ bỏ qua; các nhận xét được đánh dấu bằng ‘#’ không có trong lớp ký tự hoặc đứng trước dấu gạch chéo ngược không thoát.

Làm cho \ w, \ W, \ b, \ B, \ s và \ S chỉ thực hiện ASCII đối sánh thay vì đối sánh Unicode đầy đủ. Điều này chỉ có ý nghĩa đối với các mẫu Unicode và bị bỏ qua đối với các mẫu byte.

Tạo thành ‘.’ ký tự đặc biệt khớp với bất kỳ ký tự nào, kể cả dòng mới; 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.

Thông thường ^ chỉ khớp ở đầu chuỗi và $ chỉ khớp ở cuối chuỗi và ngay trước dòng mới (nếu có) ở cuối chuỗi . Khi cờ này được chỉ định, ^ khớp ở đầu chuỗi và ở đầu mỗi dòng trong chuỗi, ngay sau mỗi dòng mới. Tương tự, ký tự siêu ký tự $ đối sánh ở cuối chuỗi và ở cuối mỗi dòng (ngay trước mỗi dòng mới).

(^ và $ vẫn chưa được giải thích; chúng sẽ được giới thiệu trong phần Thêm Siêu ký tự.)

Ngôn ngữ là một tính năng của thư viện C nhằm mục đích trợ giúp trong việc viết các chương trình có tính đến sự khác biệt về ngôn ngữ. Ví dụ: nếu bạn đang xử lý văn bản tiếng Pháp được mã hóa, bạn muốn có thể viết \ w + để khớp các từ, nhưng \ w chỉ khớp với lớp ký tự [A-Za-z] trong các mẫu byte; nó sẽ không khớp với các byte tương ứng với é hoặc ç. Nếu hệ thống của bạn được định cấu hình đúng cách và ngôn ngữ Pháp được chọn, một số hàm C nhất định sẽ cho chương trình biết rằng byte tương ứng với é cũng nên được coi là một chữ cái. Đặt cờ LOCALE khi biên dịch một biểu thức chính quy sẽ khiến đối tượng được biên dịch kết quả sử dụng các hàm C này cho \ w; điều này chậm hơn, nhưng cũng cho phép \ w + khớp các từ tiếng Pháp như bạn mong đợi. Việc sử dụng cờ này không được khuyến khích trong Python 3 vì cơ chế ngôn ngữ rất không đáng tin cậy, nó chỉ xử lý một “văn hóa” tại một thời điểm và nó chỉ hoạt động với các 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 ngôn ngữ / địa phương khác nhau.

Make \ w, \ W, \ b, \ B và trường hợp- đối sánh không phân biệt phụ thuộc vào ngôn ngữ hiện tại thay vì cơ sở dữ liệu Unicode.

Thực hiện đối sánh không phân biệt chữ hoa chữ thường; lớp ký tự và chuỗi ký tự sẽ khớp với các chữ cái bằng cách bỏ qua chữ hoa và chữ thường. Ví dụ: [A-Z] cũng sẽ khớp với các chữ cái viết thường. Đối sánh Unicode đầy đủ cũng hoạt động trừ khi cờ ASCII được sử dụng để vô hiệu hóa đối sánh không phải ASCII. Khi các mẫu Unicode [a-z] hoặc [A-Z] được sử dụng kết hợp với cờ IGNORECASE, chúng sẽ khớp với 52 chữ cái ASCII và 4 chữ cái khác không phải ASCII: ‘İ’ (U + 0130, chữ cái viết hoa Latinh I với dấu chấm ở trên ), ‘ı’ (U + 0131, chữ cái nhỏ Latinh không có dấu chấm i), ‘ſ’ (U + 017F, dài chữ cái Latinh nhỏ) và ‘K’ (U + 212A, ký hiệu Kelvin). Thư rác sẽ khớp với ‘Thư rác’, ‘thư rác’, ‘thư rác’ hoặc ‘ſpam’ (cái sau chỉ được so khớp trong chế độ Unicode). Chữ thường này không tính đến ngôn ngữ hiện tại; điều đó sẽ xảy ra nếu bạn cũng đặt cờ LOCALE.

Tạo 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.

Đây là bảng gồm các cờ có sẵn, theo sau là giải thích chi tiết hơn về từng cờ.

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 như IGNORECASE và một dạng ngắn, một chữ cái như I. (Nếu bạn đã quen với các công cụ sửa đổi mẫu của Perl, thì các dạng một chữ cái sử dụng các chữ cái giống nhau; ví dụ: dạng ngắn gọn của re.VERBOSE là re.X.) Nhiều cờ có thể được chỉ định bằng cách bitwise HOẶC nhập chúng; lại tôi | re.M chẳng hạn đặt cả cờ I và M.

Bạn nên sử dụng các hàm cấp mô-đun này hay bạn nên lấy mẫu và tự gọi các phương thức của nó? Nếu bạn đang truy cập regex trong vòng lặp, việc biên dịch trước nó sẽ lưu một vài lệnh gọi hàm. Bên ngoài các vòng lặp, không có nhiều sự khác biệt nhờ vào bộ nhớ đệm bên trong.

Về cơ bản, các hàm này chỉ cần tạo một đối tượng mẫu cho bạn và gọi phương thức thích hợp trên đó. Chúng cũng lưu trữ đối tượng đã biên dịch trong bộ nhớ cache, vì vậy, các cuộc gọi trong tương lai sử dụng cùng một RE sẽ không cần phải phân tích cú pháp mẫu lặp đi lặp lại.

Bạn không cần phải tạo một đối tượng mẫu và gọi các phương thức của nó; mô-đun re cũng cung cấp các hàm cấp cao nhất được gọi là match (), search (), findall (), sub (), v.v. Các hàm này nhận các đối số giống như phương thức mẫu tương ứng với chuỗi RE được thêm vào làm đối số đầu tiên và vẫn trả về Không có hoặc một cá thể đối tượng khớp.

findall () phải tạo toàn bộ danh sách trước nó có thể được trả về như là kết quả. Phương thức finditer () trả về một chuỗi các cá thể đối tượng khớp dưới dạng một trình lặp:

Tiền tố r, làm cho chuỗi ký tự trở thành một chuỗi thô, là cần thiết trong ví dụ này vì các chuỗi thoát trong một chuỗi “nấu chín” bình thường nghĩa đen không được Python nhận dạng, trái ngược với các biểu thức chính quy, giờ đây dẫn đến Cảnh báo lỗi và cuối cùng sẽ trở thành Lỗi cú pháp. Xem Bệnh dịch phản ứng dữ dội.

Hai phương thức mẫu trả về tất cả các kết quả phù hợp cho một mẫu. findall () trả về danh sách các chuỗi phù hợp:

Trong các chương trình thực tế, kiểu phổ biến nhất là lưu trữ đối tượng khớp trong một biến, sau đó kiểm tra xem nó có phải là Không. Điều này thường trông giống như:

group () trả về chuỗi con được so khớp bởi RE. start () và end () trả về chỉ số bắt đầu và kết thúc của trận đấu. span () trả về cả chỉ mục bắt đầu và kết thúc trong một bộ giá trị duy nhất. Vì phương thức match () chỉ kiểm tra xem RE có khớp ở đầu chuỗi hay không, nên start () sẽ luôn bằng 0. Tuy nhiên, phương thức search () của các mẫu quét qua chuỗi, do đó, đối sánh có thể không bắt đầu từ 0 trong trường hợp đó.

Giờ đây, bạn có thể truy vấn đối tượng khớp để biết thông tin về chuỗi khớp. Các trường hợp đối tượng đối sánh cũng có một số phương thức và thuộc tính; những điều quan trọng nhất là:

Bây giờ, hãy thử nó trên một chuỗi mà nó phải khớp, chẳng hạn như nhịp độ. Trong trường hợp này, match () sẽ trả về một đối tượng khớp, vì vậy bạn nên lưu trữ kết quả trong một biến để sử dụng sau này.

Bây giờ, bạn có thể thử so khớp các chuỗi khác nhau với RE [a-z] +. Một chuỗi trống hoàn toàn không được khớp vì + có nghĩa là “một hoặc nhiều lần lặp lại”. match () sẽ trả về Không trong trường hợp này, điều này sẽ khiến trình thông dịch không in ra đầu ra. Bạn có thể in rõ ràng kết quả của match () để làm rõ điều này.

HOWTO này sử dụng trình thông dịch Python chuẩn cho các ví dụ của nó. Đầu tiên, chạy trình thông dịch Python, nhập mô-đun re và biên dịch RE:

Bạn có thể tìm hiểu về điều này bằng cách thử nghiệm tương tác với mô-đun re. Nếu bạn có sẵn tkinter, bạn cũng có thể muốn xem Công cụ / demo / redemo.py, một chương trình trình diễn đi kèm với bản phân phối Python. Nó cho phép bạn nhập RE và chuỗi, đồng thời hiển thị RE khớp hay không. redemo.py có thể khá hữu ích khi cố gắng gỡ lỗi một RE phức tạp.

so khớp () và search () trả về Không nếu không tìm thấy kết quả phù hợp nào. Nếu chúng thành công, một đối tượng đối sánh sẽ được trả về, chứa thông tin về đối sánh: vị trí bắt đầu và kết thúc, chuỗi con đối sánh và hơn thế nữa.

Tìm tất cả các chuỗi con có RE khớp và trả về chúng như một trình lặp.

Tìm tất cả các chuỗi con có RE khớp và trả về chúng dưới dạng danh sách.

Quét qua một chuỗi, tìm kiếm bất kỳ vị trí nào mà RE này khớp.

Xác định xem RE có khớp ở đầu chuỗi hay không.

Khi bạn có một đối tượng đại diện cho một biểu thức chính quy đã biên dịch, bạn sẽ làm gì với nó? Đối tượng mẫu có một số phương thức và thuộc tính. Chỉ những cái quan trọng nhất sẽ được đề cập ở đây; tham khảo tài liệu lại để có danh sách đầy đủ.

Ngoài ra, các chuỗi thoát đặc biệt hợp lệ trong biểu thức chính quy, nhưng không hợp lệ như các ký tự chuỗi Python, giờ đây dẫn đến Cảnh báo lỗi và cuối cùng sẽ trở thành Lỗi cú pháp, lỗi này có nghĩa là các chuỗi sẽ không hợp lệ nếu ký hiệu chuỗi thô hoặc thoát dấu gạch chéo ngược không được sử dụng.

Giải pháp là sử dụng ký hiệu chuỗi thô của Python cho các biểu thức chính quy; 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 chuỗi ký tự có tiền tố là ‘r’, vì vậy r “\ n” là chuỗi hai ký tự chứa ‘\’ và ‘n’, trong khi “\ n” là chuỗi một ký tự chứa một dòng mới. Biểu thức chính quy thường sẽ được viết bằng mã Python bằng cách sử dụng ký hiệu chuỗi thô này.

Nói tóm lại, để khớp với một dấu gạch chéo ngược theo nghĩa đen, người ta phải viết ‘\\\\’ là chuỗi RE, 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 biểu thị bằng \\ bên trong một chuỗi Python thông thường. Trong các RE có các dấu gạch chéo ngược lặp đi lặp lại, điều này dẫn đến nhiều dấu gạch chéo ngược lặp lại và làm cho các chuỗi kết quả khó hiểu.

Giả sử bạn muốn viết RE khớp với phần string \, có thể được tìm thấy trong tệp LaTeX. Để tìm ra những gì cần viết trong mã chương trình, hãy bắt đầu với chuỗi mong muốn được so khớp. Tiếp theo, bạn phải thoát khỏi bất kỳ dấu gạch chéo ngược nào và các ký tự siêu lớn khác bằng cách đặt trước chúng bằng dấu gạch chéo ngược, dẫn đến phần string \\. Chuỗi kết quả phải được chuyển tới re.compile () phải là phần \\. Tuy nhiên, để thể hiện điều này dưới dạng một chuỗi Python theo nghĩa đen, cả hai dấu gạch chéo ngược phải được thoát ra một lần nữa.

Như đã nêu trước đó, các biểu thức chính quy sử dụng ký tự dấu 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 mâu thuẫn với việc Python sử dụng cùng một ký tự cho cùng mục đích trong chuỗi ký tự.

Xem Thêm  SQL TRIM: Cách xóa các ký tự không mong muốn khỏi chuỗi - sql xóa các ký tự khỏi chuỗi bên phải

Đặt RE trong chuỗi giúp ngôn ngữ Python đơn giản hơn, nhưng có một nhược điểm là chủ đề của phần tiếp theo.

RE được chuyển tới re.compile () dưới dạng một chuỗi. RE được xử lý dưới dạng chuỗi vì các biểu thức chính quy không phải là một phần của ngôn ngữ Python cốt lõi và không có cú pháp đặc biệt nào được tạo ra để diễn đạt chúng. (Có những ứng dụng hoàn toàn không cần RE, vì vậy không cần phải làm cồng kềnh đặc tả ngôn ngữ bằng cách bao gồm chúng.) Thay vào đó, mô-đun re chỉ đơn giản là một mô-đun mở rộng C được bao gồm trong Python, giống như mô-đun socket hoặc zlib.

re.compile () cũng chấp nhận đối số cờ tùy chọn, được sử dụng để kích hoạt các tính năng đặc biệt khác nhau và các biến thể cú pháp. Chúng ta sẽ xem xét các cài đặt có sẵn sau, nhưng bây giờ một ví dụ duy nhất sẽ làm:

Biểu thức chính quy được biên dịch thành các đối tượng mẫu, có các phương thức cho các hoạt động khác nhau, chẳng hạn như tìm kiếm đối sánh mẫu hoặc thực hiện thay thế chuỗi .

Bây giờ chúng ta đã xem xét một số biểu thức chính quy đơn giản, làm cách nào để chúng ta thực sự sử dụng chúng trong Python? Mô-đun re cung cấp giao diện cho công cụ biểu thức chính quy, cho phép bạn biên dịch các RE thành các đối tượng và sau đó thực hiện đối sánh với chúng.

Thêm Pattern Power

Cho đến nay, chúng tôi mới chỉ đề cập đến một phần các tính năng của biểu thức chính quy. Trong
phần này, chúng tôi sẽ đề cập đến một số siêu ký tự mới và cách sử dụng nhóm để
truy xuất các phần của văn bản đã khớp.

Các siêu ký tự khác

Có một số siêu nhân vật mà chúng tôi chưa đề cập đến. Hầu hết chúng sẽ
được đề cập trong phần này.

Một số siêu ký tự còn lại sẽ được thảo luận có độ rộng bằng 0
khẳng định. Chúng không làm cho động cơ tiến qua chuỗi;
thay vào đó, họ không sử dụng ký tự nào cả, và chỉ đơn giản là thành công hay thất bại. Vì
ví dụ, \ b là xác nhận rằng vị trí hiện tại nằm ở một từ
ranh giới; vị trí hoàn toàn không bị thay đổi bởi \ b . Điều này có nghĩa rằng
Không bao giờ được lặp lại các xác nhận có độ rộng bằng không, bởi vì nếu chúng khớp một lần thì
vị trí nhất định, chúng rõ ràng có thể được đối sánh vô số lần.

|

Thay thế, hoặc toán tử “hoặc”. Nếu A và B là biểu thức chính quy,
A | B sẽ khớp với bất kỳ chuỗi nào khớp với A hoặc B. | có rất
mức độ ưu tiên thấp để làm cho nó hoạt động hợp lý khi bạn luân phiên
chuỗi nhiều ký tự. Crow | Servo sẽ khớp với 'Crow' hoặc 'Servo ',
không phải 'Cro' , 'w' hoặc ' S '' ervo '.

Để khớp với một ký tự '|' , hãy sử dụng \ | hoặc đặt nó bên trong một lớp ký tự ,
như trong [|] .

^

Đối sánh ở đầu dòng. Trừ khi cờ MULTILINE đã được
được đặt, điều này sẽ chỉ khớp ở đầu chuỗi. Trong MULTILINE
, điều này cũng khớp ngay sau mỗi dòng mới trong chuỗi.

Ví dụ: nếu bạn muốn đối sánh từ Từ chỉ ở đầu
dòng, RE để sử dụng là ^ Từ .

 

& gt; & gt; & gt;

in

(

lại

.

tìm kiếm

(

'^ Từ'

,

'From Here to Eternity'

))

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

& gt; & gt; & gt;

print

(

re

.

tìm kiếm

(

'^ Từ'

,

'Học từ bộ nhớ'

))

Không có

Để khớp với một chữ '^' , hãy sử dụng \ ^ .

$

Đối sánh ở cuối dòng, là được định nghĩa là phần cuối của chuỗi,
hoặc bất kỳ vị trí nào được theo sau bởi một ký tự dòng mới.

 

& gt; & gt; & gt;

print

(

re

.

tìm kiếm

(

'} $'

,

'

{block}

'

))

& lt; re.Match đối tượng; span = (6, 7), khớp = '}' & gt;

& gt; & gt; & gt;

print

(

re

.

tìm kiếm

(

'} $'

,

'

{block}

'

))

Không có

& gt; & gt; & gt;

print

(

re

.

tìm kiếm

(

'} $'

,

'

{block}

\ n < / p>

'

))

& lt; re.Match đối tượng; span = (6, 7), khớp = '}' & gt;

Để đối sánh một chữ '$' , hãy sử dụng \ $ hoặc đặt nó bên trong một lớp nhân vật,
như trong [$] .

\ A

Chỉ khớp ở đầu chuỗi. Khi không ở chế độ MULTILINE ,
\ A ^ thực sự giống nhau. Ở chế độ MULTILINE , chúng
khác nhau: \ A vẫn chỉ khớp ở đầu chuỗi, nhưng ^
có thể khớp ở bất kỳ vị trí nào bên trong chuỗi theo sau một ký tự dòng mới.

\ Z

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

\ b

Ranh giới từ. Đây là khẳng định có độ rộng bằng 0 chỉ khớp vớ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 chữ và số
các ký tự, vì vậy phần cuối của một từ được biểu thị bằng khoảng trắng hoặc dấu
ký tự không phải chữ và số.

Ví dụ sau chỉ đối sánh với class khi nó là một từ hoàn chỉnh; nó sẽ không
khớp khi nó được chứa bên trong một từ khác.

 

& gt; & gt; & gt;

p

=

re

.

biên dịch

(

r

'\ bclass \ b'

)

& gt; & gt; & gt;

print

(

p

.

tìm kiếm

(

'không có lớp nào cả'

))

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

& gt; & gt; & gt;

print

(

p

.

tìm kiếm

(

'thuật toán đã giải mật'

< p class = "p">))

Không có

& gt; & gt; & gt;

print

(

p

.

tìm kiếm

(

'một lớp con là'

< p class = "p">))

Không có

Có hai điều tinh tế bạn nên nhớ khi sử dụng trình tự đặc biệt này.
Đầu tiên, đây là lần va chạm tồi tệ nhất giữa các ký tự chuỗi của Python và
trình tự biểu thức. Trong chuỗi ký tự của Python, \ b là khoảng trắng xóa
ký tự, giá trị ASCII 8. Nếu bạn không sử dụng chuỗi thô, thì Python sẽ
chuyển đổi \ b vào một backspace và RE của bạn sẽ không khớp như bạn mong đợi.
Ví dụ sau trông giống như RE trước của chúng tôi, nhưng bỏ qua 'r'
trước chuỗi RE.

 

& gt; & gt; & gt;

p

=

re

.

biên dịch

(

'

\ b

class

\ b

'

< p class = "p">)

& gt; & gt; & gt;

print

(

p

.

tìm kiếm

(

'không có lớp nào cả'

))

Không có

& gt; & gt; & gt;

print

(

p

.

tìm kiếm

(

'

\ b

'

+

' class '

+

'

\ b

' < / p>

))

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

Thứ hai, bên trong một lớp ký tự, nơi không được sử dụng cho khẳng định này,
\ b đại diện cho ký tự xóa lùi, để tương thích với Python
chuỗi ký tự.

\ B

Một khẳng định không-width khác, đây là đối lập với \ b , chỉ khớp khi
vị trí hiện tại không nằm ở ranh giới từ.

Phân nhóm

Thông thường, bạn cần thu thập nhiều thông tin hơn là chỉ xem RE có khớp không
hay không. Biểu thức chính quy thường được sử dụng để phân tích các chuỗi bằng cách viết RE
được chia thành nhiều nhóm con phù hợp với các thành phần quan tâm khác nhau.
Ví dụ: dòng tiêu đề RFC-822 được chia thành tên tiêu đề và giá trị,
được phân tách bằng ':' , như sau:

 

Từ: author@example.com Tác nhân người dùng: Thunderbird 1.5.0.9 (X11 / 20061227) MIME-Phiên bản: 1.0 Tới: editor@example.com

Điều này có thể được xử lý bằng cách viết một biểu thức chính quy khớp với toàn bộ
dòng tiêu đề và có một nhóm khớp với tên tiêu đề và một nhóm khác
phù hợp với giá trị của tiêu đề.

Các nhóm được đánh dấu bằng siêu ký tự '(' , ')' . '(' ')'
có nhiều ý nghĩa giống như chúng trong các biểu thức toán học; họ nhóm
kết hợp các biểu thức có bên trong chúng và bạn có thể lặp lại nội dung
của một nhóm có bộ định lượng lặp lại, chẳng hạn như * , + , ? hoặc
{m, n} . Ví dụ: (ab) * sẽ khớp với không hoặc nhiều lần lặp lại
ab .

 

& gt; & gt; & gt;

p

=

re

.

biên dịch

(

'(ab) *'

)

& gt; & gt; & gt;

print

(

p

.

khớp

(

'ababababab'

)

.

span

())

(0, 10)

Các nhóm được chỉ định bằng '(' , ')' cũng nắm bắt được phần bắt đầu và kết thúc
chỉ mục của văn bản mà chúng phù hợp; điều này có thể được truy xuất bằng cách chuyển một đối số
tới group () , start () , end ()
span () . Nhóm là
được đánh số bắt đầu bằng 0. Nhóm 0 luôn luôn có mặt; nó là toàn bộ RE, vì vậy
Các phương thức match object đều có nhóm 0 làm mặc định
tranh luận. Sau đó, chúng ta sẽ xem cách thể hiện các nhóm không nắm bắt được khoảng thời gian
văn bản phù hợp với nhau.

 

& gt; & gt; & gt;

p

=

lại

.

biên dịch

(

'(a) b'

)

& gt; & gt; & gt;

m

=

p

.

khớp

(

'ab'

)

& gt; & gt; & gt;

m

.

nhóm

()

'ab'

& gt; & gt; & gt;

m

.

nhóm

(

0

)

'ab'

Các nhóm con được đánh số từ trái sang phải, từ 1 trở lên. Các nhóm có thể được lồng vào nhau;
để xác định số lượng, chỉ cần đếm các ký tự mở ngoặc đơn, sẽ
từ trái sang phải.

 

& gt; & gt; & gt;

p

=

re

.

biên dịch

(

'(a (b) c) d'

)

& gt; & gt; & gt;

m

=

p

.

khớp

(

'abcd'

)

& gt; & gt; & gt;

m

.

nhóm

(

0

)

'abcd'

& gt; & gt; & gt;

m

.

nhóm

(

1

)

'abc'

& gt; & gt; & gt;

m

.

nhóm

(

2

)

'b'

group () có thể được chuyển nhiều số nhóm cùng một lúc, trong trường hợp đó
sẽ trả về một bộ chứa các giá trị tương ứng cho các nhóm đó.

 

& gt; & gt; & gt;

m

.

nhóm

(

2

,

1

,

2

)

('b', 'abc', 'b')

nhóm () phương thức trả về một bộ giá trị chứa các chuỗi cho tất cả
nhóm con, từ 1 đến tuy nhiên có nhiều nhóm.

 

& gt; & gt; & gt;

m

.

nhóm

()

('abc', 'b')

Các tham chiếu ngược trong một mẫu cho phép bạn chỉ định rằng nội dung của một
nhóm bắt cũng phải được tìm thấy tại vị trí hiện tại trong chuỗi. Vì
ví dụ, \ 1 sẽ thành công nếu bạn có thể tìm thấy nội dung chính xác của nhóm 1 tại
vị trí hiện tại, và không thành công. Hãy nhớ rằng chuỗi của Python
các chữ cũng sử dụng dấu gạch chéo ngược theo sau là các số để cho phép bao gồm tùy ý
các ký tự trong một chuỗi, vì vậy hãy đảm bảo sử dụng một chuỗi thô khi kết hợp
tham chiếu ngược trong RE.

Ví dụ: RE sau đây phát hiện các từ được nhân đôi trong một chuỗi.

 

& gt; & gt; & gt;

p

=

re

.

biên dịch

(

r

'\ b (\ w +) \ s + \ 1 \ b'

)

& gt; & gt; & gt;

p

.

tìm kiếm

(

'Paris vào xuân'

)

.

nhóm

()

'the'

Các tham chiếu ngược như thế này thường không hữu ích cho việc chỉ tìm kiếm qua một chuỗi
– có một số định dạng văn bản lặp lại dữ liệu theo cách này – nhưng bạn sẽ sớm
nhận ra rằng chúng rất hữu ích khi thực hiện thay thế chuỗi.

Các nhóm được đặt tên và không nắm bắt được

Các RE kỹ lưỡng có thể sử dụng nhiều nhóm, cả hai để thu thập các chuỗi quan tâm và
để nhóm và cấu trúc chính RE. Trong các RE phức tạp, rất khó để
theo dõi các số lượng nhóm. Có hai tính năng giúp giải quyết vấn đề này
vấn đề. Cả hai đều sử dụng một cú pháp chung cho phần mở rộng biểu thức chính quy, vì vậy
chúng ta sẽ xem xét vấn đề đó trước.

Perl 5 nổi tiếng với những bổ sung mạnh mẽ cho các biểu thức chính quy chuẩn.
Đối với những tính năng mới này, các nhà phát triển Perl không thể chọn siêu ký tự lần nhấn một phím mới
hoặc các chuỗi đặc biệt mới bắt đầu bằng \ mà không làm cho Perl trở thành thông thường
biểu thức khác với RE tiêu chuẩn một cách khó hiểu. Nếu họ chọn & amp; như một
ví dụ: siêu ký tự mới, các biểu thức cũ sẽ giả định rằng & amp;
một ký tự thông thường và sẽ không thoát khỏi nó bằng cách viết \ & amp; hoặc [& amp;] . < / p>

Giải pháp được các nhà phát triển Perl chọn là sử dụng (? ...) làm
cú pháp mở rộng. ? ngay sau dấu ngoặc đơn là lỗi cú pháp
bởi vì ? sẽ không có gì để lặp lại, vì vậy điều này không giới thiệu bất kỳ
vấn đề tương thích. Các ký tự ngay sau ? cho biết
tiện ích mở rộng nào đang được sử dụng, vì vậy (? = foo) là một điều (một cái nhìn tích cực
khẳng định) và (?: foo) là một cái gì đó khác (một nhóm không nắm bắt có chứa
biểu thức con foo ).

Python hỗ trợ một số tiện ích mở rộng của Perl và thêm một tiện ích mở rộng
cú pháp cho cú pháp mở rộng của Perl. Nếu ký tự đầu tiên sau
dấu chấm hỏi là P , bạn biết rằng đó là một phần mở rộng
dành riêng cho Python.

Bây giờ chúng ta đã xem xét cú pháp tiện ích mở rộng chung, chúng ta có thể quay lại
đến các tính năng giúp đơn giản hóa việc làm việc với các nhóm trong các RE phức tạp.

Đôi khi bạn muốn sử dụng một nhóm để biểu thị một phần của biểu thức chính quy,
nhưng không quan tâm đến việc truy xuất nội dung của nhóm. Bạn có thể biến điều này thành sự thật
rõ ràng bằng cách sử dụng nhóm không nắm bắt: (?: ...) , nơi bạn có thể thay thế
... với bất kỳ biểu thức chính quy nào khác.

 

& gt; & gt; & gt;

m

=

re

.

khớp

(

"([abc]) +"

,

"abc"

)

& gt; & gt; & gt;

m

.

nhóm

()

('c',)

& gt; & gt; & gt;

m

=

re

.

khớp

(

"(?: [abc]) +"

,

"abc"

)

& gt; & gt; & gt;

m

.

nhóm

()

()

Ngoại trừ thực tế là bạn không thể truy xuất nội dung của nhóm
phù hợp, một nhóm không bắt giữ hoạt động giống hệt như một nhóm bắt;
bạn có thể đặt bất cứ thứ gì bên trong nó, lặp lại nó với một siêu ký tự lặp lại như vậy
dưới dạng * và lồng nó vào các nhóm khác (chụp hoặc không chụp).
(?: ...) đặc biệt hữu ích khi sửa đổi một mẫu hiện có, vì bạn
có thể thêm các nhóm mới mà không thay đổi cách đánh số của tất cả các nhóm khác. Nó
nên được đề cập rằng không có sự khác biệt về hiệu suất trong việc tìm kiếm giữa
nhóm bắt và không bắt; không có hình thức nào nhanh hơn hình thức kia.

Một tính năng quan trọng hơn được đặt tên cho các nhóm: thay vì đề cập đến chúng bằng
số, nhóm có thể được tham chiếu bằng một cái tên.

Cú pháp cho một nhóm được đặt tên là một trong những phần mở rộng dành riêng cho Python:
(? p & lt; name & gt; ...) . rõ ràng là tên của nhóm. Nhóm được đặt tên
hoạt động giống hệt như thu thập các nhóm và thêm vào đó là liên kết tên
với một nhóm. Các phương thức match object xử lý
tất cả các nhóm nắm bắt đều chấp nhận một trong hai số nguyên tham chiếu đến nhóm theo số
hoặc các chuỗi có chứa tên của nhóm mong muốn. Các nhóm được đặt tên vẫn
các số nhất định, vì vậy bạn có thể truy xuất thông tin về một nhóm theo hai cách:

 

& gt; & gt; & gt;

p

=

re

.

biên dịch

(

r

'(? p & lt; word & gt; \ b \ w + \ b)'

)

& gt; & gt; & gt;

m

=

p

.

tìm kiếm

(

'((((Rất nhiều dấu câu)) ) '

)

& gt; & gt; & gt;

m

.

nhóm

(

'word'

)

'Rất nhiều'

& gt; & gt; & gt;

m

.

nhóm

(

1

)

'Rất nhiều'

Ngoài ra, bạn có thể truy xuất các nhóm đã đặt tên dưới dạng từ điển với
groupdict () :

 

& gt; & gt; & gt;

m

=

re

.

phù hợp

(

r

'(? p & lt; first & gt; \ w +) (? p & lt; last & gt; \ w +)'

,

'Jane Doe '

)

& gt; & gt; & gt;

m

.

groupdict

()

{'first': 'Jane', 'last': 'Doe'}

Các nhóm được đặt tên rất tiện lợi vì chúng cho phép bạn sử dụng các tên dễ nhớ, thay vào đó
của việc phải nhớ các con số. Đây là ví dụ RE từ ứng dụng khách giao thức imaplib < / span>
mô-đun:

 

Ngày nội bộ

=

lại

< p class = "o">.

biên dịch

(

r

'INTERNALDATE "'

r

'(? p & lt; day & gt; [123] [0-9]) - (? p & lt; mon & gt; [A-Z] [a-z] [a-z]) - '

r

'(? p & lt; năm & gt; [0-9] [0-9] [0-9] [0-9])'

r

'(? p & lt; giờ & gt; [0-9] [0-9]) :(? p & lt; min & gt; [0-9 ] [0-9]) :(? P & lt; sec & gt; [0-9] [0-9]) '

r

'(? p & lt; zonen & gt; [- +]) (? p & lt; zoneh & gt; [0-9] [0-9]) (? P & lt; zonem & gt; [0-9] [0-9]) '

r

'"'

)

Rõ ràng là dễ dàng hơn nhiều để truy xuất m.group ('zonem') , thay vì phải
nhớ lấy nhóm 9.

Cú pháp cho tham chiếu ngược trong một biểu thức chẳng hạn như (...) \ 1 đề cập đến
số của nhóm. Đương nhiên có một biến thể sử dụng tên nhóm
thay vì số. Đây là một phần mở rộng Python khác: (? P = name) cho biết
rằng nội dung của nhóm được gọi là tên phải được khớp lại với
điểm hiện tại. Biểu thức chính quy để tìm các từ được nhân đôi,
\ b (\ w +) \ s + \ 1 \ b cũng có thể được viết dưới dạng \ b (? p & lt; word & gt; \ w +) \ s + (? p = word) \ b :

 

& gt; & gt; & gt;

p

=

re

.

biên dịch

(

r

'\ b (? p & lt; word & gt; \ w +) \ s + (? p = word) \ b'

)

& gt; & gt; & gt;

p

.

tìm kiếm

(

'Paris vào xuân'

)

.

nhóm

()

'the'

Xác định của Lookahead

Một khẳng định khác có độ rộng bằng 0 là khẳng định nhìn trước. Xác nhận trên đầu nhìn
có sẵn ở cả dạng khẳng định và phủ định và trông giống như sau:

(? = ...)

Xác nhận tích cực trên lookahead. Điều này thành công nếu
biểu thức, được đại diện ở đây bởi ... , khớp thành công ở hiện tại
vị trí, và không thành công. Nhưng, một khi biểu thức chứa đã được
đã thử, công cụ phù hợp không tiến triển chút nào; phần còn lại của mô hình là
đã thử ngay nơi xác nhận bắt đầu.

(?! ...)

Khẳng định tiêu cực. Điều này ngược lại với khẳng định tích cực;
nó thành công nếu biểu thức được chứa không khớp ở vị trí hiện tại
trong chuỗi.

Để làm cho điều này cụ thể, hãy xem xét một trường hợp mà một cái nhìn trước là hữu ích.
Hãy xem xét một mẫu đơn giản để khớp với một tên tệp và tách nó thành một cơ sở
tên và một phần mở rộng, được phân tách bằng . . Ví dụ: trong news.rc ,
news là tên cơ sở và rc là phần mở rộng của tên tệp.

Mẫu để phù hợp với điều này khá đơn giản:

. * [.]. * $

Lưu ý rằng . cần được xử lý đặc biệt vì nó là
siêu ký tự, vì vậy nó nằm trong một lớp ký tự để chỉ khớp với
nhân vật cụ thể. Cũng lưu ý đến $ ở cuối; cái này được thêm vào
đảm bảo rằng tất cả phần còn lại của chuỗi phải được bao gồm trong
sự mở rộng. Biểu thức chính quy này khớp với foo.bar
autoexec.bat sendmail.cf print.conf < / code>.

Bây giờ, hãy xem xét việc phức tạp hóa vấn đề một chút; nếu bạn muốn kết hợp thì sao
tên tệp trong đó phần mở rộng không phải là bat ? Một số lần thử không chính xác:

. * [.] [^ b]. * $ Lần thử đầu tiên ở trên cố gắng loại trừ bat bằng cách yêu cầu
rằng ký tự đầu tiên của tiện ích mở rộng không phải là b . Cái này sai,
vì mẫu cũng không khớp với foo.bar .

. * [.] ([^ b] .. |. [^ a]. | .. [^ t]) $

Biểu thức trở nên lộn xộn hơn khi bạn cố gắng kết hợp giải pháp đầu tiên bằng cách
yêu cầu một trong các trường hợp sau phải khớp: ký tự đầu tiên của
phần mở rộng không phải là b ; ký tự thứ hai không phải là a ; hoặc ký tự thứ ba
không phải là t . Điều này chấp nhận foo.bar và từ chối autoexec.bat , nhưng nó
yêu cầu phần mở rộng gồm ba ký tự và sẽ không chấp nhận tên tệp có hai ký tự
phần mở rộng chẳng hạn như sendmail.cf . Chúng tôi sẽ làm phức tạp mô hình một lần nữa trong một
nỗ lực để sửa chữa nó.

. * [.] ([^ b].?.? |. [^ a]?.? | ..? [^ t]?) $

Trong lần thử thứ ba, tất cả các chữ cái thứ hai và thứ ba đều được làm tùy chọn trong
để cho phép các tiện ích mở rộng phù hợp ngắn hơn ba ký tự, chẳng hạn như
sendmail.cf .

Hiện tại, mẫu đang trở nên thực sự phức tạp, điều này khiến bạn khó đọc và
hiểu biết. Tệ hơn nữa, nếu sự cố thay đổi và bạn muốn loại trừ cả bat
exe dưới dạng phần mở rộng, mẫu sẽ càng phức tạp hơn và
khó hiểu.

Một cái nhìn tiêu cực cắt bỏ tất cả sự nhầm lẫn này:

. * [.] (?! bat $) [^.] * $ Cái nhìn phủ định có nghĩa là: nếu biểu thức con dơi
không khớp ở điểm này, hãy thử phần còn lại của mẫu; nếu bat $ không
phù hợp, toàn bộ mô hình sẽ không thành công. Dấu $ ở cuối là bắt buộc để đảm bảo
cái gì đó giống như sample.batch , trong đó phần mở rộng chỉ bắt đầu bằng
bat , sẽ được cho phép. [^.] * đảm bảo rằng mẫu hoạt động
khi có nhiều dấu chấm trong tên tệp.

Việc loại trừ phần mở rộng tên tệp khác giờ đây thật dễ dàng; chỉ cần thêm nó như một
thay thế bên trong khẳng định. Mẫu sau loại trừ các tên tệp
kết thúc bằng bat hoặc exe :

. * [.] (?! bat $ | exe $) [^.] * $


Xem thêm những thông tin liên quan đến chủ đề ví dụ về chuỗi python regex

Regular Expression Tutorial Python | Python Regex Tutorial

  • Tác giả: codebasics
  • Ngày đăng: 2021-12-01
  • Đánh giá: 4 ⭐ ( 8998 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Regular expression python tutorial. I will take a real life example of extracting information out of tesla's company filing and show you how you can use regular expression in python to extract some of the required information easily.

    Code: https://github.com/codebasics/py/blob/master/Advanced/regex/regex_tutorial_python.ipynb
    Exercise: https://github.com/codebasics/py/blob/master/Advanced/regex/regex_tutorial_exercise_questions.ipynb

    ⭐️ Timestamps ⭐️
    00:00 Introduction
    00:32 Coding
    24:34 Exercise

    Do you want to learn technology from me? Check https://codebasics.io/ for my affordable video courses.

    🌎 Website: https://codebasics.io/

    🎥 Codebasics Hindi channel: https://www.youtube.com/channel/UCTmFBhuhMibVoSfYom1uXEg

    ️⃣ Social Media ️⃣
    🔗 Discord: https://discord.gg/r42Kbuk
    📸 Instagram: https://www.instagram.com/codebasicshub/
    🔊 Facebook: https://www.facebook.com/codebasicshub
    📱 Twitter: https://twitter.com/codebasicshub
    📝 Linkedin (Personal): https://www.linkedin.com/in/dhavalsays/
    📝 Linkedin (Codebasics): https://www.linkedin.com/company/codebasics/
    🔗 Patreon: https://www.patreon.com/codebasics?fan_landing=true

    ❗❗ DISCLAIMER: All opinions expressed in this video are of my own and not that of my employers'.

Regular Expression (RegEx) trong Python

  • Tác giả: nq.com.vn
  • Đánh giá: 5 ⭐ ( 2058 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Chi tiết bài học 14.Biểu thức chính quy trong Python

  • Tác giả: vimentor.com
  • Đánh giá: 3 ⭐ ( 9445 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Vimentor chi tiết bài học Biểu thức chính quy trong Python: re.match (), re.search (), re.findall () với Ví dụ

Python RegEx (Có ví dụ)

  • Tác giả: trithucdoisong.net
  • Đánh giá: 3 ⭐ ( 4433 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: MỘT Regular Bán tạipression (RegEx) là một chuỗi các ký tự xác định một mẫu tìm kiếm. Ví dụ,

Regular Expression (RegEx) trong Python

  • Tác giả: arrowtran.com
  • Đánh giá: 4 ⭐ ( 1691 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Chương tiếp theo của bài học nâng cao Python, chúng ta sẽ cùng tìm hiểu về Regular Expression (RegEx) với module re cùng các ví dụ cụ thể để bạn dễ hình dung

Tìm hiểu về biểu thức chính quy trong Python

  • Tác giả: t3h.edu.vn
  • Đánh giá: 3 ⭐ ( 4202 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: [Hầu như ngôn ngữ lập trình nào cũng hỗ trợ Regular expression (Regex). Cùng tìm hiểu ngay về Regex trong Python và các hàm Regex trong bài viết dưới đây.]

Regex trong Python

  • Tác giả: viettuts.vn
  • Đánh giá: 3 ⭐ ( 9050 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Biểu thức chính quy (Regular Expressions) hay Regex trong Python có thể được định nghĩa là chuỗi các ký tự được sử dụng để tìm kiếm một mẫu trong chuỗi.

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

By ads_php