2013-09-26 170 views
23

Tại sao pep8 lại phàn nàn về chuỗi tiếp theo trong mã?pep8 cảnh báo về chuỗi regex bằng Python, Eclipse

import re 
re.compile("\d{3}") 

Cảnh báo tôi nhận được:

ID:W1401 Anomalous backslash in string: '\d'. String constant might be missing an r prefix. 

Bạn có thể giải thích ý nghĩa của thông điệp là gì? Tôi cần phải thay đổi mã nào để cảnh báo W1401 được thông qua?

Mã vượt qua các thử nghiệm và chạy như mong đợi. Hơn nữa \d{3} là một regex hợp lệ.

Trả lời

35

"\d" giống với "\\d" vì không có chuỗi thoát cho d. Nhưng nó không phải là rõ ràng cho người đọc mã.

Nhưng, hãy xem xét \t. "\t" đại diện cho tab chracter, trong khi r"\t" đại diện cho chữ số \t.

Vì vậy, sử dụng chuỗi nguyên khi bạn có nghĩa đen \d:

re.compile(r"\d{3}") 

hoặc thoát xuyệc ngược một cách rõ ràng:

re.compile("\\d{3}") 
+0

Cảm ơn, tôi không hề biết về tiền tố 'r' và chức năng của nó. – alandarev

+0

Đến muộn, nhưng '\ d' không giống như' \\ d'. Trước đây khớp với bất kỳ chữ số (Unicode) nào; sau đó khớp với dấu gạch chéo ngược, sau đó là 'd'. Chúng không tương đương. Pylint dường như là sai ở đây. –

+2

@moodforaday, Thử ''\ d' == '\\ d'' trong trình tương tác python. Ngoài ra ''\ t' == '\\ t'' – falsetru