Ký tự r trước biểu thức chính quy cho biết trong lệnh gọi để tìm kiếm() chỉ định biểu thức chính quy là chuỗi thô. Điều này cho phép dấu gạch chéo ngược được sử dụng trong cụm từ thông dụng dưới dạng ký tự thông thường thay vì trong chuỗi 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 tìm lại xử lý các chuỗi được truyền cho nó, trình thông dịch Python lấy một dấu đầu tiên trên chuỗi. Nếu có dấu gạch chéo ngược có trong chuỗi, trình thông dịch Python phải quyết định xem mỗi bộ phận có phải là một phần của chuỗi thoát Python (ví dụ: \ n hoặc \ t) hay không.
Lưu ý: tại thời điểm này, Python không quan tâm liệu '\' có phải là ký tự meta biểu thức chính quy hay không.
Nếu '\' được theo sau bởi một ký tự thoát Python được nhận dạng (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ó sẽ được thông qua và được hiểu là ký tự '\'.
Hãy 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
Thỉnh thoảng, chúng tôi muốn đưa vào chuỗi một chuỗi ký tự bao gồm '\' mà không cần Python hiểu là trình tự thoát. Để làm điều này, chúng ta thoát khỏi '\' bằng '\'. Bây giờ khi Python 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 preprocessing
Sau khi trình thông dịch Python truyền qua cả hai chuỗi, chúng được chuyển sang phương pháp tìm kiếm của mô-đun. Phương thức tìm kiếm phân tích chuỗi biểu thức chính quy để xác định các ký tự meta của cụm từ thông dụng.
Bây giờ '\' cũng là ký tự meta biểu thức chính quy đặc biệt và được hiểu là một UNLESS nó được thoát tại thời điểm phương thức tìm kiếm lại() được thực hiện.
Xem xét cuộc gọi sau.
>>> match = re.search('a\\t','a\\t') //Match is None
Tại đây, đối sánh là Không. Tại sao? Cho phép xem xét các chuỗi sau khi trình thông dịch Python thực hiện.
String 1: 'a\t'
String 2: 'a\t'
Vậy tại sao khớp bằng Không?Khi tìm kiếm() 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à ký tự meta, không phải là ký tự bình thường. Dấu gạch chéo ngược trong Chuỗi 2 tuy nhiên không có biểu thức chính quy và đã được xử lý bởi trình thông dịch Python, vì vậy nó được hiểu là ký tự thông thường.
Vì vậy, phương thức search() đang tìm 'escape-t' trong chuỗi 'a \ t' không khớp.
Để khắc phục điều này, chúng tôi có thể yêu cầu phương thức search() không diễn giải '\' làm siêu ký tự. Chúng ta có thể làm điều này bằng cách thoát nó.
Xem xét cuộc gọi sau.
>>> match = re.search('a\\\\t','a\\t') // Match contains 'a\t'
Một lần nữa, hãy xem các chuỗi sau khi trình thông dịch Python đã vượt qua.
String 1: 'a\\t'
String 2: 'a\t'
Bây giờ khi phương thức search() xử lý cụm từ thông dụng, nó phát hiện dấu gạch chéo ngược thứ hai được thoát bởi dấu đầu tiên và không được coi là ký tự meta. Do đó, nó giải thích chuỗi là 'a \ t', khớp với Chuỗi 2.
Một cách khác để tìm kiếm() xem '\' như một ký tự là đặt dấu r trước biểu thức chính quy. Điều này báo cho trình thông dịch Python KHÔNG xử lý trước chuỗi.
Hãy xem xét điều này.
>>> match = re.search(r'a\\t','a\\t') // match contains 'a\t'
Tại đây trình thông dịch Python không sửa đổi chuỗi đầu tiên nhưng xử lý chuỗi thứ hai. Các chuỗi thông qua để tìm kiếm() là:
String 1: 'a\\t'
String 2: 'a\t'
Như trong ví dụ trước, tìm kiếm diễn giải '\' là ký tự đơn '\' và không phải là một siêu nhân vật, do đó phù hợp với String 2.
http://stackoverflow.com/questions/24085680/why-do-backslashes-appear-twice – fghj
Có thể trùng lặp của [Không thể thoát khỏi dấu gạch chéo ngược với regex?] (Https://stackoverflow.com/questions/4025482/ cant-escape-the-backslash-with-regex) – tripleee