2016-01-31 3 views
17

Czy istnieje sposób na manipulowanie ciągiem w języku Python za pomocą następujących sposobów?Obsługa spacji za pomocą notacji kropkowej

Dla dowolnego ciągu znaków, który jest przechowywany w notacji z kropkami, na przykład:

s = "classes.students.grades" 

Czy istnieje sposób, aby zmienić łańcuch na następujące kwestie:

"classes.students" 

Zasadniczo, usuń wszystko, aż do w tym ostatni okres. Tak więc "restaurants.spanish.food.salty" stanie się "restaurants.spanish.food".

Dodatkowo, czy istnieje sposób na określenie, co stanie się po ostatnim okresie? Powodem, dla którego chcę to zrobić, jest użycie isDigit().

Tak więc, jeśli to było classes.students.grades.0 mogłem chwycić 0 jakoś, więc mogę użyć instrukcji if z isdigit i powiedzieć, czy ta część napisu po ostatnim okresie (tak 0 w tym przypadku) jest cyfrą, usuń go, w przeciwnym razie zostaw.

Odpowiedz

20

można użyć split i join razem:

s = "classes.students.grades" 
print '.'.join(s.split('.')[:-1]) 

Jesteś Dzielenie ciąg na . - będzie to daje listę łańcuchów, po które łączą elementy listy z powrotem do ich rozdzielenie łańcucha przez .

[:-1] odbierze wszystkie elementy z listy ale ostatni

Aby sprawdzić, co przychodzi po ostatnim .:

s.split('.')[-1] 

Innym sposobem jest użycie rsplit. To działa w ten sam sposób jak podzielić ale jeśli podasz maxsplit parametr będzie to podzielić ciąg począwszy od końca:

rest, last = s.rsplit('.', 1) 

'classes.students' 
'grades' 

Można również wykorzystać re.sub zastąpić część po ostatnim . z pusty ciąg:

re.sub('\.[^.]+$', '', s) 

i ostatnia część twojego pytania do zawijania słów w [] polecam użyć format i list comprehension:

''.join("[{}]".format(e) for e in s.split('.')) 

Będzie daje pożądany wynik:

[classes][students][grades] 
+2

Dlaczego tak dużo pracy, kiedy można po prostu podzielone na * Ostatnia * kropka z 'str.rsplit()' lub 'str.rpartition()'? –

+1

@minitoto: Twoje podejście dzieli się na * wszystkie * kropki, wymagające dodatkowego ''.'. Join()'. Używając '.rsplit ('.', 1) [0]' lub jeszcze lepiej, '.rpartition ('.') [0]' daje wymagany wynik bez konieczności ponownego dołączania. Obie te metody również dają ci ogon, część po ostatniej kropce. –

+0

Co jest złego w robieniu s [: - s.find (". ')], Aby uzyskać wszystko przed ostatnim". i robienie s [s.rfind (". ') + 1:], aby uzyskać wszystko po ostatniej kropce? – OriginalCliche

13

jeśli '.' in s, s.rpartition('.') znajdzie ostatnią kropkę w s,
i zwraca (before_last_dot, dot, after_last_dot):

s = "classes.students.grades" 
s.rpartition('.')[0] 
15

Najlepszym sposobem aby to zrobić używa się metody rsplit i podajemy argument maxsplit.

>>> s = "classes.students.grades" 
>>> before, after = s.rsplit('.', maxsplit=1) # rsplit('.', 1) in Python 2.x onwards 
>>> before 
'classes.students' 
>>> after 
'grades' 

Można również użyć metody rfind() z normalnej eksploatacji plasterka.

aby wszystko przed ostatnim .:

>>> s = "classes.students.grades" 
>>> last_index = s.rfind('.') 
>>> s[:last_index] 
'classes.students' 

Wtedy wszystko po ostatnim .

>>> s[last_index + 1:] 
'grades' 
+5

dla pojedynczego podziału, 'str.rpartition()' będzie szybszy .. –

4

Jeśli twoim celem jest pozbycie się ostatniego składnika, który jest tylko jedna cyfra, początek i koniec z re.sub():

s = re.sub(r"\.\d$", "", s) 

Wykona to zadanie i pozostawi w spokoju inne struny. Nie musisz robić niczego więcej.

Jeżeli chcesz wiedzieć o ogólnym przypadku (oddzielić ostatni składnik, bez względu na to co to jest), a następnie użyć rsplit podzielić swój ciąg raz:

>>> "hel.lo.there".rsplit(".", 1) 
['hel.lo', 'there'] 

Jeśli nie ma kropki w ciąg, po prostu otrzymasz jeden element w swojej tablicy, cały ciąg.

0

Możesz to zrobić po prostu za pomocą rsplit (str.rsplit([sep[, maxsplit]]), która zwróci listę, łamiąc każdy element wzdłuż danego separatora. Można również określić, ile dzieli powinny być wykonywane:

>>> s = "res.spa.f.sal.786423" 
>>> s.rsplit('.',1) 
['res.spa.f.sal', '786423'] 

więc ostateczna funkcji, które opisują to:

def dimimak_cool_function(s): 
    if '.' not in s: return s 
    start, end = s.rsplit('.', 1) 
    return start if end.isdigit() else s 

>>> dimimak_cool_function("res.spa.f.sal.786423") 
'res.spa.f.sal' 
>>> dimimak_cool_function("res.spa.f.sal") 
'res.spa.f.sal' 
+0

Jak ta odpowiedź różni się od już udzielonych odpowiedzi? – tinySandy

+0

Żadna z pozostałych odpowiedzi nie odpowiada na część dotyczącą isdigit. Mój jest jedynym, który udziela odpowiedzi końcowej. – DevShark