Một ký tự R trước biểu thức chính quy trong lệnh gọi để tìm kiếm () chỉ định rằng biểu thức chính quy là một chuỗi thô. Điều này cho phép sử dụng dấu gạch chéo ngược trong biểu thức thông thường như các ký tự thông thường hơn là trong một chuỗi các ký tự thoát. Hãy để tôi giải thích ...
Trước khi phương thức tìm kiếm của mô -đun RE xử lý các chuỗi được truyền cho nó, trình thông dịch Python sẽ vượt qua chuỗi ban đầu. Nếu có các dấu gạch chéo ngược trong một chuỗi, trình thông dịch Python phải quyết định xem mỗi người là một phần của chuỗi thoát Python (ví dụ: \ n hoặc \ t) hoặc không.
Lưu ý: Tại thời điểm này, Python không quan tâm liệu '\' có phải là một nhân vật tổng hợp biểu thức thông thường hay không.
Nếu '\' được theo sau bởi một ký tự thoát Python được công nhận (t, n, v.v.), thì dấu gạch chéo ngược và ký tự thoát được thay thế bằng ký tự unicode hoặc 8 bit thực tế. Ví dụ: '\ t' sẽ được thay thế bằng ký tự ASCII cho tab. Nếu không, nó được truyền qua và được hiểu là một nhân vật '\'.
Xem xét những điều sau đây.
>>> s = '\t' >>> print ("[" + s + "]") >>> [ ] // an actual tab character after preprocessing >>> s = '\d' >>> print ("[" + s + "]") >>> [\d] // '\d' after preprocessingĐôi khi chúng tôi muốn đưa vào một chuỗi một chuỗi ký tự bao gồm '\' mà không được Python hiểu là một chuỗi thoát. Để làm điều này, chúng tôi thoát khỏi '\' với '\'. Bây giờ khi Python nhìn thấy '\', nó thay thế hai dấu gạch chéo ngược bằng một ký tự '\' duy nhất.
>>> s = '\\t' >>> print ("[" + s + "]") >>> [\t] // '\t' after preprocessingSau khi trình thông dịch Python vượt qua cả hai chuỗi, chúng được chuyển sang phương thức tìm kiếm của mô -đun RE. Phương thức tìm kiếm phân tích chuỗi biểu thức thông thường để xác định các ký tự meta của biểu thức thông thường.
Bây giờ '\' cũng là một nhân vật tổng hợp biểu thức thông thường đặc biệt và được hiểu là một trừ khi nó được thoát ra tại thời điểm phương thức tìm kiếm RE () được thực thi.
Xem xét cuộc gọi sau.
>>> match = re.search('a\\t','a\\t') //Match is NoneỞ đây, trận đấu là không có. Tại sao? Hãy nhìn vào các chuỗi sau khi thông dịch viên Python thực hiện vượt qua.
String 1: 'a\t' String 2: 'a\t'Vậy tại sao khớp với không có? Khi search () diễn giải chuỗi 1, vì nó là một biểu thức chính quy, dấu gạch chéo ngược được hiểu là một nhân vật tổng hợp, không phải là một ký tự thông thường. Tuy nhiên, dấu gạch chéo ngược trong chuỗi 2 không nằm trong một biểu thức thông thường và đã được trình thông dịch Python xử lý, vì vậy nó được hiểu là một ký tự thông thường.
Vì vậy, phương thức search () đang tìm kiếm 'A Escape-t' trong chuỗi 'a \ t' không phải là một trận đấu.
Để khắc phục điều này, chúng ta có thể nói cho phương thức search () để không giải thích '\' như một nhân vật tổng hợp. Chúng ta có thể làm điều này bằng cách thoát khỏi nó.
Xem xét cuộc gọi sau.
Ở đây, trận đấu là không có. Tại sao? Hãy nhìn vào các chuỗi sau khi thông dịch viên Python thực hiện vượt qua.Vậy tại sao khớp với không có? Khi search () diễn giải chuỗi 1, vì nó là một biểu thức chính quy, dấu gạch chéo ngược được hiểu là một nhân vật tổng hợp, không phải là một ký tự thông thường. Tuy nhiên, dấu gạch chéo ngược trong chuỗi 2 không nằm trong một biểu thức thông thường và đã được trình thông dịch Python xử lý, vì vậy nó được hiểu là một ký tự thông thường.
String 1: 'a\\t' String 2: 'a\t'Vì vậy, phương thức search () đang tìm kiếm 'A Escape-t' trong chuỗi 'a \ t' không phải là một trận đấu.
Để khắc phục điều này, chúng ta có thể nói cho phương thức search () để không giải thích '\' như một nhân vật tổng hợp. Chúng ta có thể làm điều này bằng cách thoát khỏi nó.
>>> match = re.search('a\\\\t','a\\t') // Match contains 'a\t'
>>> match = re.search(r'a\\t','a\\t') // match contains 'a\t'Một lần nữa, hãy nhìn vào các chuỗi sau khi phiên dịch viên Python đã vượt qua.
String 1: 'a\\t' String 2: 'a\t'Bây giờ khi phương thức tìm kiếm () xử lý biểu thức chính quy, nó thấy rằng dấu gạch chéo ngược thứ hai được thoát ra bởi phương pháp thứ nhất và không nên được coi là một nhân vật tổng hợp. Do đó, nó diễn giải chuỗi là 'a \ t', phù hợp với chuỗi 2.
Cuối cùng, "\" có thể được sử dụng để thoát khỏi chính nó: "\\" là ký tự dấu gạch chéo ngược theo nghĩa đen.
Giả sử bạn muốn viết một RE khớp với chuỗi "\ mart", có thể được tìm thấy trong một 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 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 metacharacters khác bằng cách trước chúng bằng một dấu gạch chéo ngược, dẫn đến chuỗi "\\ phần". Chuỗi kết quả phải được chuyển cho re.compile () phải là \\section. Tuy nhiên, để thể hiện điều này như 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.LATEX file. To figure out what to write in the program code, start with the desired string to be matched. Next, you must escape any backslashes and other metacharacters by preceding them with a backslash, resulting in the string "\\section". The resulting string that must be passed to re.compile() must be \\section. However, to express this as a Python string literal, both backslashes must be escaped again.
\section | Chuỗi văn bản được khớp |
________số 8 | Thoát khỏi sự chao đảo cho re.compile |
>>> s = '\\t' >>> print ("[" + s + "]") >>> [\t] // '\t' after preprocessing 1 | Thoát khỏi sự chéo ngược cho một chuỗi theo nghĩa đen |
Nói tóm lại, để phù hợp với dấu gạch chéo ngược theo nghĩa đen, người ta phải viết '\\\\\\' làm chuỗi re, vì biểu thức thông thường phải là "\\" và mỗi dấu gạch chéo ngược phải được biểu thị là "\\" bên trong một python thông thường chuỗi chữ. Trong RES đó là các dấu gạch chéo ngược nhiều lần, điều này dẫn đến rất nhiều dấu gạch chéo ngược lặp đi lặp lại khiến các chuỗi kết quả khó hiểu.
Giải pháp là sử dụng ký hiệu chuỗi thô của Python cho các biểu thức thông thường; BackSlashes không được xử lý theo bất kỳ cách đặc biệt nào trong một chuỗi theo nghĩa đen được đặt trước với "r", vì vậy r "\ n" là một chuỗi hai tính năng chứa "\" và "n", trong khi "\ n" là một chuỗi một ký tự chứa một dòng mới. Các biểu thức thường xuyên thường xuyên sẽ được thể hiện trong mã Python bằng cách sử dụng ký hiệu chuỗi thô này.
>>> s = '\\t' >>> print ("[" + s + "]") >>> [\t] // '\t' after preprocessing 2 | r "ab*" |
>>> s = '\\t' >>> print ("[" + s + "]") >>> [\t] // '\t' after preprocessing 1 | r "\\ phần" |
>>> s = '\\t' >>> print ("[" + s + "]") >>> [\t] // '\t' after preprocessing 4 | r "\ w+\ s+\ 1" |