2013-06-03 22 views
33

Próbuję wykonać następujące czynności, w sposób jasny pythonic sposób:Usuń prefiks z ciągiem

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

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

Daje:

xtensions 

co nie jest to, czego się spodziewałem (extensions) . Oczywiście (głupio), ponieważ błędnie użyłem lstrip: lstrip usunie wszystkie znaki, które pojawiają się w podanym ciągu chars, nie biorąc pod uwagę tego ciągu jako prawdziwego ciągu, ale jako "zestaw znaków do usunięcia od początku ciągu znaków ".

Czy istnieje standardowy sposób usunięcia podciągu od początku łańcucha?

Odpowiedz

72

nie wiem o "sposób standardowy".

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

** To powinno być standardem 'metoda str' ** konieczności ręcznego przedefiniować tę funkcję użytkową w projekcie _wszystkie_ Pythona obłudny. Nie jest to wystarczająco tępy, aby zapewnić hermetyzację w pełnej wersji biblioteki innej firmy. Jest jednak dość denerwujące, aby wszędzie na nowo określić definicję. Niezrozumiałe skargi na bok, dziękuję za ten soczysty kawałek radości Python! –

5

rozwiązanie regex (nie używać, należy skorzystać z rozwiązania przez @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

Co o tym (trochę późno):

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

+1 Zwięzły. Ale czy możesz zrobić coś Podnieść coś w przypadku błędu, i nadal pasuje do 2 linii x 80 kolumn? –

+0

@personal_cloud: 'return s [s [: len (prefix)]. Index (prefix) + len (prefix):]' –

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

Tak na marginesie zauważyć, str jest zła nazwa zmiennej, ponieważ cienie typ str.

3

Myślę, że można to zrobić za pomocą metod typu str. Nie ma potrzeby dla wyrażeń regularnych:

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()' zwraca zastąpiony ciąg znaków, więc nie zapomnij powiedzieć "tekst" = text.replace (prefix, "", 1) ':) – TerryA

+0

@Haidro: Ups, to właśnie zamierzałem zrobić, po prostu nie wpisałem go poprawnie. Przypuszczam, że możesz również zwrócić wynik wywołania 'replace'. – Blckknght

16

krótkie i słodkie.

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

@jamylak to jak "trójskładnik" i - lub, ale poprawny :) ... +1, chociaż myślę, że jest trochę zbyt sprytny dla prawdziwego kodu. I nie możesz zdecydować, że chcesz inaczej zgłaszać wyjątek. – Elazar