2013-06-03 32 views
33

Tôi cố gắng để làm như sau, theo một cách pythonic rõ ràng:Hủy bỏ một tiền tố từ một chuỗi

def remove_prefix(str, prefix): 
    return str.lstrip(prefix) 

print remove_prefix('template.extensions', 'template.') 

Điều này cho phép:

xtensions 

Mà không phải là những gì tôi đã mong đợi (extensions) . Rõ ràng là (tôi ngu ngốc), vì tôi đã sử dụng lstrip sai: lstrip sẽ xóa tất cả các ký tự xuất hiện trong chuỗi chars được chuyển, không xem chuỗi đó là chuỗi thực, mà là "một tập hợp các ký tự cần xóa khỏi đầu chuỗi ".

Có cách nào tiêu chuẩn để xóa chuỗi con khỏi đầu chuỗi không?

Trả lời

72

Tôi không biết về "cách tiêu chuẩn".

def remove_prefix(text, prefix): 
    if text.startswith(prefix): 
     return text[len(prefix):] 
    return text # or whatever 
+23

** Đây nên là một tiêu chuẩn 'phương pháp str' ** Có tự xác định lại chức năng tiện ích này trong dự án _every_ Python là không liên tục. Nó không đủ can đảm để đảm bảo gói gọn trong thư viện của bên thứ ba. Nhưng nó _is_ gây phiền nhiễu đủ để đảm bảo xác định lại ở khắp mọi nơi. Bỏ qua một bên, cảm ơn cho chút ngon ngọt này của niềm vui Pythonic! –

5

giải pháp regex (không sử dụng, sử dụng giải pháp của @Elazar)

import re 
def remove_prefix(text, prefix): 
    return re.sub(r'^{0}'.format(re.escape(prefix)), '', text) 

>>> print remove_prefix('template.extensions', 'template.') 
extensions 
12

gì về vấn đề này (hơi muộn):

def remove_prefix(s, prefix): 
    return s[len(prefix):] if s.startswith(prefix) else s 
+0

+1 Ngắn gọn. Nhưng bạn có thể làm cho nó Nâng cao cái gì đó trong trường hợp lỗi, và vẫn còn phù hợp với nó trong 2 dòng x 80 cột? –

+0

@personal_cloud: 'return s [s [: len (tiền tố)]. Index (tiền tố) + len (tiền tố):]' –

0
def remove_prefix(str, prefix): 
    if str.startswith(prefix): 
     return str[len(prefix):] 
    else: 
     return str 

Là một lưu ý sang một bên, str là một cái tên xấu cho một biến bởi vì nó bóng tối kiểu str.

3

Tôi nghĩ bạn có thể sử dụng các phương thức thuộc loại str để thực hiện việc này. Không cần phải cho biểu thức thông thường:

def remove_prefix(text, prefix): 
    if text.startswith(prefix): # only modify the text if it starts with the prefix 
     text = text.replace(prefix, "", 1) # remove one instance of prefix 
    return text 
+2

'replace()' trả về chuỗi được thay thế, vì vậy đừng quên thực sự nói 'văn bản = text.replace (tiền tố, "", 1) ':) – TerryA

+0

@ Haidro: Rất tiếc, đó là những gì tôi dự định làm, tôi chỉ không nhập chính xác. Tôi cho rằng bạn cũng có thể trả về kết quả của cuộc gọi 'replace'. – Blckknght

16

ngắn và ngọt ngào:.

def remove_prefix(text, prefix): 
    return text[text.startswith(prefix) and len(prefix):] 
+1

@jamylak nó giống như "ternary" và - hoặc, nhưng đúng :) ... 1, mặc dù tôi nghĩ rằng nó hơi quá thông minh đối với mã thực. Và bạn không thể quyết định bạn muốn nó đưa ra một ngoại lệ khác. – Elazar

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