2011-01-30 15 views
7

Mam ciąg wejściowy w następujący sposób: a1b2c30d40 i chcę tokenize ciąg znaków do: a, 1, b, 2, c, 30, d, 40.Python string splitting

Wiem, że potrafię czytać poszczególne znaki jedna po drugiej i śledzić poprzedni znak, aby określić, czy powinienem tokenizować, czy nie (2 cyfry z rzędu oznaczają, że nie tokenizuję), ale czy jest tam bardziej pytonowo robić to?

Odpowiedz

13
>>> re.split(r'(\d+)', 'a1b2c30d40') 
['a', '1', 'b', '2', 'c', '30', 'd', '40', ''] 

Na wzór: jak komentarz mówi \d oznacza „mecz jedna cyfra” + to modyfikator, który oznacza „dopasować jedną lub więcej”, więc \d+ środki „meczu tyle cyfr, jak to możliwe”. Zostało to wprowadzone do grupy (), więc cały wzorzec w kontekście re.split oznacza "podzielenie tego ciągu przy użyciu jak największej liczby cyfr jako separatora, dodatkowo przechwytywanie dopasowanych separatorów do wyniku". Jeśli pominiesz grupę, otrzymasz ['a', 'b', 'c', 'd', ''].

+0

Umm Nie rozumiem regex bardzo dobrze. Czy masz jakieś wytłumaczenie wzoru (\ d +)? – Hery

+1

Dzieli się na cyfry/kolejne cyfry ('\ d' to 0-9,' + 'oznacza jeden lub więcej). – delnan

+1

http://docs.python.org/library/re.html – Samizdis

Powiązane problemy