Hiểu cách ký tự "$" hoạt động trong biểu thức chính quy của Python
- Khi dùng mô-đun
re của Python, ^ thường được biết đến là "đầu chuỗi", còn $ là "cuối chuỗi".
- Tuy nhiên,
$ không phải lúc nào cũng chỉ có nghĩa là "cuối chuỗi", và cách hoạt động của nó có thể khác nhau tùy nền tảng.
- Trong Python, khi chế độ multiline bị tắt, ký tự
$ có thể khớp với cuối chuỗi hoặc vị trí ngay trước ký tự xuống dòng ở cuối chuỗi.
Sự khác biệt giữa khớp cuối chuỗi và ký tự xuống dòng
- Khi chế độ multiline bị tắt, nếu muốn khớp đúng cuối chuỗi trong Python mà không bao gồm ký tự xuống dòng, chỉ dùng
$ là không đủ.
- Có thể dùng
\z và \Z để khớp với cuối chuỗi.
- Trong Python, khi dùng
re.MULTILINE, $ sẽ khớp với cuối chuỗi và cuối mỗi dòng (ngay trước ký tự xuống dòng).
So sánh hành vi biểu thức chính quy trên nhiều nền tảng
- Bảng so sánh việc mẫu có khớp với
cat\n hay không trên nhiều nền tảng cho thấy rằng nếu chấp nhận khớp cả ký tự xuống dòng, thì dùng $ trong chế độ multiline sẽ cho hành vi nhất quán.
- Nếu muốn khớp mà không bao gồm ký tự xuống dòng, thì trên mọi nền tảng trừ Python và ECMAScript nên dùng
\z, còn với Python và ECMAScript thì lần lượt dùng \Z hoặc $ khi không bật chế độ multiline.
Ý kiến của GN⁺
- Bài viết này có thể giúp các lập trình viên dùng biểu thức chính quy cảnh giác hơn về hành vi không như mong đợi của ký tự
$ trong Python.
- Biểu thức chính quy rất mạnh trong xử lý chuỗi, nhưng cần chú ý vì hành vi có thể khác nhau giữa các nền tảng.
- Các lập trình viên cần nhận thức rõ những khác biệt này và thực hiện thêm kiểm thử để tránh vấn đề tương thích khi phát triển ứng dụng đa nền tảng.
- Những thư viện biểu thức chính quy khác cung cấp chức năng tương tự gồm
java.util.regex của Java và System.Text.RegularExpressions của .NET; với các thư viện này cũng cần hiểu và sử dụng đúng theo khác biệt hành vi của từng nền tảng.
- Khi đưa vào cú pháp hoặc hành vi biểu thức chính quy mới, cần cân nhắc khả năng tương thích với mã hiện có, tác động đến hiệu năng và độ dốc học tập trong nhóm, đồng thời đánh giá kỹ lợi ích và chi phí mà thay đổi đó mang lại.
1 bình luận
Ý kiến Hacker News
grep,sed,awk, Python, v.v.) mặc định xử lý nó là cuối dòng.