2012-05-14 51 views
15

Có cách nào để thực hiện phương pháp str.strip(), ngoại trừ tất cả các sự kiện, không chỉ ở đầu và cuối chuỗi?Xóa tất cả các lần xuất hiện của một vài ký tự khỏi một chuỗi

Ví dụ:

>> '::2012-05-14 18:10:20.856000::'.strip(' -.:') 
>> '2012-05-14 18:10:20.856000' 

Tôi muốn

>> '::2012-05-14 18:10:20.856000::'.crazy_function(' -.:') 
>> '20120514181020856000' 

Liệu Python cung cấp cho tôi một built-in crazy_function ???

Tôi có thể dễ dàng thực hiện theo chương trình, nhưng tôi muốn biết liệu có tích hợp sẵn cho điều đó hay không. Không thể tìm thấy. Cảm ơn sự giúp đỡ của bạn.

Trả lời

21

Sử dụng translate chức năng để xóa các ký tự không mong muốn:

>>> '::2012-05-14 18:10:20.856000::'.translate(None, ' -.:') 
'20120514181020856000' 

Hãy chắc chắn chuỗi của bạn là str loại và không unicode, như các thông số của chức năng sẽ không giống nhau. Đối với unicode, sử dụng cú pháp sau; nó bao gồm trong việc xây dựng các dict của ordinals unicode từ chars xóa và để ánh xạ họ None:

>>> u'::2012-05-14 18:10:20.856000::'.translate({ord(k):None for k in u' -.:'}) 
u'20120514181020856000' 

Một số timings để so sánh hiệu suất với re:

>>> timeit.timeit("""re.sub(r"[ -.:]", r"", "'::2012-05-14 18:10:20.856000::'")""","import re") 
7.352270301875713 
>>> timeit.timeit("""'::2012-05-14 18:10:20.856000::'.translate(None, ' -.:')""") 
0.5894893344550951 
+0

Tôi thích giải pháp dựng sẵn như thế này trên giải pháp được viết bởi Nick Craig-Wood. Nhưng tôi tự hỏi: Về mặt hiệu suất, điều gì tốt hơn? Tôi có thể sai, nhưng chức năng 'dịch' này có thể sử dụng chức năng regexp. – Francisco

+0

@Francisco: Tôi đoán có hai chức năng dịch khác nhau. Phiên bản 3-arugment hoạt động với các chuỗi _byte, nó sử dụng một bảng dịch, ánh sáng nhanh. Phiên bản unicode hoạt động trên _strings_, nó thay thế các ký tự từng cái một và thực sự cũng chậm như regexp nếu không chậm hơn. Tôi vẫn sử dụng các biểu thức chính quy cho vấn đề của bạn, vì việc trộn _strings_ và _byte sequences_ không bao giờ là một ý tưởng hay, ngay cả trong python2. – georg

+0

@ thg435: Trong vấn đề của tôi speifically phiên bản byte là tốt. Tôi đang tạo mã id dựa trên str (datetime.datetime.now()) và thêm một chuỗi thêm vào nó. Vì vậy, unicode không phải là một vấn đề đối với tôi. – Francisco

4

Bạn có thể làm điều đó một cách dễ dàng đủ với re.sub

>>> import re 
>>> re.sub(r"[ -.:]", r"", "'::2012-05-14 18:10:20.856000::'") 
'20120514181020856000' 
>>> 
1

không, tôi không nghĩ rằng có một xây dựng trong.

Tôi sẽ làm theo cách này:

>>> s = '::2012-05-14 18:10:20.856000::' 
>>> 
>>> ''.join(x for x in s if x not in ' -.:') 
'20120514181020856000' 
>>> 
+1

Doh. dịch. Tất nhiên. – cdjc

+0

Cảm ơn, nhưng đó là "lập trình". – Francisco

+0

Nhìn vào câu trả lời khác sử dụng dịch –

Các vấn đề liên quan