NOTE: In [n]: là ký hiệu bắt đầu mỗi câu lệnh trong Ipython shell
Out[n]: là ký hiệu đầu ra, kết quả của câu lệnh vừa chạy.
Cho chuỗi sau:
In [4]: s = '....slsslslsls...sls'Yêu cầu cắt bỏ đoạn '.sls' ở đuôi.
Ta rất dễ dùng lệnh strip hay thậm chí cẩn thận hơn là rstrip để làm việc này, thế nhưng...
In [5]: s.rstrip('.sls')Như bạn thấy, lệnh rstrip sẽ xóa liên tực các ký tự '.' 's' 'l' từ phải sang, và đó là điều ta không mong đợi.
Out[5]: ''
In [6]: s2 = '....slsasls.sls'
In [7]: s2.rstrip('.sls')
Out[7]: '....slsa'
s.replace('.sls', ‘’) cũng không phải giải pháp hay vì nó sẽ replace hết.
Sau đây là vài cách để làm được điều này:
In [11]: '.sls'.join(s.split('.sls')[:-1])Hoặc có thể dùng 1 hàm có sẵn ở os.path
Out[11]: '....slsslslsls..'
In [12]: s[:s.rfind('.sls')] # best way for me
Out[12]: '....slsslslsls..'
In [2]: import osHoặc có thể dùng regex.
In [5]: s = 'slslsl...sls.sls'
In [6]: os.path.splitext(s)
Out[6]: ('slslsl...sls', '.sls')
Kết luận ngắn:
- Cách chính xác để cắt string trong python là slice (vì string trong python là iterable)
- Khi bạn định làm gì đó liên quan đến file, filename, path ..., hãy tìm trong os.path hay các thư viện builtin giúp thực hiện việc đó trước. os.path.join(a, b) sẽ giúp join 2 phần của 1 path một cách chính xác, đơn giản nhất. :3
Nếu có cách nào hay hơn, bạn hãy suggest ở phần comment nhóe :3
Sao ko dùng s[:-4]
ReplyDeletecũng được nhưng phải đếm , cái rfind tự tìm
Deletethì s[:-len('.sls')] cho đỡ phải đếm =))
Deletenói thật mới học nên không thích nhớ function một tẹo nào, toàn dùng cái cơ bản find, replace ... và slices nhưng code sẽ dài hơn trong một số trường hợp :v
Delete