2011-06-25 13 views
5

Domyślna metoda split w Pythonie traktuje kolejne spacje jako pojedynczy ogranicznik. Ale jeśli określić ciąg separatora, kolejne separatory są nie zawalił:Python dzieli kolejne separatory

>>> 'aaa'.split('a') 
['', '', '', ''] 

Jaki jest najprostszy sposób, aby zwinąć kolejne separatory? Wiem, że mogę usunąć puste ciągi z listy wyników:

>>> result = 'aaa'.split('a') 
>>> result 
['', '', '', ''] 
>>> result = [item for item in result if item] 

Ale czy istnieje wygodniejszy sposób?

+0

Wygląda na to, że można to osiągnąć dzięki 're.split' –

+1

Interesujące! Nie zdawałem sobie sprawy, że 'split()' bez argumentów zrobiło coś, czego nie można było replikować przez 'split' z argumentami. – weronika

Odpowiedz

7

Można użyć wyrażenia regularnego jako separatora, na przykład:

re.split(pattern, string[, maxsplit=0, flags=0]) 

Od the docs.

2

Można użyć wyrażeń regularnych:

re.split(pattern, string[, maxsplit=0, flags=0]) 

jak

re.split('a+', 'aaa') 
+0

[Składnia wyrażeń regularnych Pythona] (http://docs.python.org/library/re.html#regular-expression-syntax), jeśli to konieczne. –

0

Nie, nie ma wygodniejszego sposobu. Albo napisz własną funkcję podziału, albo usuń puste ciągi.

Ale twoje rozwiązanie wydaje się bardzo jasne i pythonic.

0

Chociaż to nie jest dokładnie to, o co prosiłeś, możesz pozbyć się wszystkich nieunikalne tokenów za pomocą set:

>>> result 
['', '', ''] 
>>> set(result) 
set(['']) 
10

To jest tak zwięzły jak można dostać:

string = 'aaa' 
result = [s for s in string.split('a') if s] 

Albo można przełączyć się do wyrażeń regularnych:

string = 'aaa' 
result = re.split('a+', string) 
+0

@anonymous downvote: Chcesz wyjaśnić? – orlp

+0

Świetne rozwiązanie! Wzorzec 'a +' zostanie podzielony przez jak najwięcej następujących po sobie 'a'. Tak więc, uruchamiając 're.split ('a +', string)' zwróci '['', '']]'. Powiedz, że 'string = 'baaac'' następnie zwróci' [' b ',' c '] '. – DomingoR

1

Myślę, że rozwiązaniem jest pe rfectly OK. Oto odpowiednik:

filter(bool, 'aaa'.split('a')) 

Prawdopodobnie nie jest tak wyraźny jak rozumienie list.

+1

Przepraszam, ale to rozwiązanie jest dość złe. Również filtr zmieniony w python3 i nie będzie miał tego samego wyniku. –

+0

Czy możesz wyjaśnić, dlaczego jest on zły (poza tym jego zachowanie zmieniło się w python 3, którego nie znałem)? – jena

+0

, ponieważ dodajesz wywołanie funkcji do funkcji bool (narzut) i czynisz ją mniej czytelną. –