Sử dụng itertools.groupby
cùng với str.isalpha
phương pháp:
docstring:
groupby (iterable [, keyfunc]) -> tạo ra một iterator mà trả (key, phụ iterator) được phân nhóm theo mỗi giá trị của khóa (giá trị).
docstring:
S.isalpha() -> bool
Return True nếu tất cả các ký tự trong S là chữ cái và có ít nhất một ký tự trong S, False nếu không thì.
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']
Hoặc có thể re.findall
hoặc re.split
từ 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']
Đối với việc thực hiện, có vẻ như rằng việc sử dụng một regex có lẽ nhanh hơn:
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
Bài viết sau (SO) trả lời chính xác câu hỏi của bạn;) http://stackoverflow.com/questions/3340081/product-code-looks-like-abcd2343-what-to-split-by-letters-and -numbers gr, M. – Michael