2013-03-22 78 views
9

Tôi đang xử lý các chuỗi như sau: "125A12C15" Tôi cần phải phân tách chúng ở các ranh giới giữa các chữ cái và số, ví dụ: cái này sẽ trở thành ["125","A","12","C","15"].Tách các chữ cái từ các số trong một chuỗi

Có cách nào thanh lịch hơn để làm điều này trong Python hơn là đi qua vị trí của nó theo vị trí và kiểm tra xem đó là một chữ cái hoặc một số, và sau đó nối cho phù hợp? Ví dụ. một chức năng hoặc mô-đun tích hợp cho loại điều này?

Cảm ơn mọi con trỏ! Lastalda

+0

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

Trả lời

26

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 
+0

're.findall' hoạt động độc đáo, cảm ơn bạn! – Lastalda

Các vấn đề liên quan