2013-03-22 15 views
9

Przetwarzam ciągi takie jak to: "125A12C15" Muszę podzielić je na granice między literami i liczbami, np. ten powinien stać się ["125","A","12","C","15"].Dzielenie liter od liczb w ciągu znaków

Czy jest to bardziej elegancki sposób w Pythonie niż przechodzenie przez to położenie po pozycji i sprawdzanie, czy jest to litera czy liczba, a następnie łączenie się? Na przykład. wbudowana funkcja lub moduł do tego typu rzeczy?

Dzięki za wszelkie wskazówki! Lastalda

+0

Poniższy (SO) artykuł odpowiada dokładnie na twoje pytanie;) http://stackoverflow.com/questions/3340081/product-code-looks-like-abcd2343-what-to-split-by-letters-and -numbers gr, M. – Michael

Odpowiedz

26

Zastosowanie itertools.groupby wraz z str.isalpha sposób:

Docstring:

GroupBy (iterowalny [, keyfunc]) -> utworzyć iteracyjnej, która zwraca (klawisz, SUB-iteracyjnej) spis każda wartość klucza (wartość).


Docstring:

S.isalpha() -> bool

return true jeśli wszystkie znaki ws są alfabetyczne i istnieje co najmniej jeden znak w S, False Inaczej.


In [1]: from itertools import groupby 

In [2]: s = "125A12C15" 

In [3]: [''.join(g) for _, g in groupby(s, str.isalpha)] 
Out[3]: ['125', 'A', '12', 'C', '15'] 

Lub ewentualnie re.findall lub re.split z regular expressions module:

In [4]: import re 

In [5]: re.findall('\d+|\D+', s) 
Out[5]: ['125', 'A', '12', 'C', '15'] 

In [6]: re.split('(\d+)', s) # note that you may have to filter out the empty 
           # strings at the start/end if using re.split 
Out[6]: ['', '125', 'A', '12', 'C', '15', ''] 

In [7]: re.split('(\D+)', s) 
Out[7]: ['125', 'A', '12', 'C', '15'] 

Jeśli chodzi o wydajność, to wydaje się, że za pomocą wyrażenia regularnego jest prawdopodobnie szybciej:

In [8]: %timeit re.findall('\d+|\D+', s*1000) 
100 loops, best of 3: 2.15 ms per loop 

In [9]: %timeit [''.join(g) for _, g in groupby(s*1000, str.isalpha)] 
100 loops, best of 3: 8.5 ms per loop 

In [10]: %timeit re.split('(\d+)', s*1000) 
1000 loops, best of 3: 1.43 ms per loop 
+0

"re.findall" działa ładnie, dziękuję! – Lastalda

Powiązane problemy