2016-01-26 20 views
5

Tôi có một chuỗi văn bản trông như thế này:re.split với khoảng trống trong python

'      19,301   14,856  18,554' 

ở đâu một không gian.

Tôi đang cố gắng phân chia nó trên không gian màu trắng, nhưng tôi cần giữ lại tất cả khoảng trắng như một mục trong danh sách mới. Như thế này:

['      ', '19,301','  ', '14,856', '  ', '18,554'] 

Tôi đã sử dụng đoạn mã sau:

re.split(r'(+)(?=[0-9])', item) 

và nó sẽ trả về:

['', '      ', '19,301', '  ', '14,856', '  ', '18,554'] 

Chú ý rằng nó luôn luôn thêm một phần tử rỗng với đầu của tôi danh sách. Thật dễ dàng để thả nó, nhưng tôi thực sự muốn hiểu những gì đang xảy ra ở đây, vì vậy tôi có thể nhận được mã để điều trị một cách nhất quán. Cảm ơn.

+0

chương trình mong muốn đầu ra – tinySandy

+2

IMHO, sử dụng '\ s' làm cho nó ** ít ** rõ ràng và chỉ gây phiền nhiễu nếu có ai ở đây muốn thực tế ly thử nó –

+0

@StefanPochmann đã đồng ý. điều này khó hơn để giải quyết –

Trả lời

4

Khi sử dụng Phương pháp re.split, nếu nhóm chụp được đối sánh ở đầu chuỗi, "result will start with an empty string". Lý do cho điều này là để phương thức join có thể hoạt động như nghịch đảo của phương thức split.

Nó có thể không có ý nghĩa đối với trường hợp của bạn, nơi các dấu phân cách phù hợp với các kích cỡ khác nhau, nhưng nếu bạn nghĩ về trường hợp các dấu phân tách là một ký tự | và bạn muốn thực hiện chuỗi rỗng thêm nó sẽ làm việc:

>> item = '|19,301|14,856|18,554' 
>> items = re.split(r'\|', item) 
>> print items 
['', '19,301', '14,856', '18,554'] 
>> '|'.join(items) 
'|19,301|14,856|18,554' 

Nhưng mà không có nó, các đường ống ban đầu sẽ bị mất:

>> items = ['19,301', '14,856', '18,554'] 
>> '|'.join(items) 
'19,301|14,856|18,554' 
3

Bạn có thể làm điều đó với re.findall():

>>> s = '\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s19,301\s\s\s\s\s\s\s\s\s14,856\s\s\s\s\s\s\s\s18,554'.replace('\\s',' ') 
>>> re.findall(r' +|[^ ]+', s) 
['      ', '19,301', '   ', '14,856', '  ', '18,554'] 

Bạn nói "không gian" trong câu hỏi, vì vậy mô hình làm việc với không gian. Cho phù hợp với chạy của bất kỳ ký tự khoảng trắng, bạn có thể sử dụng:

>>> re.findall(r'\s+|\S+', s) 
['      ', '19,301', '   ', '14,856', '  ', '18,554'] 

Các mô hình phù hợp với một hoặc nhiều ký tự khoảng trắng hoặc một hoặc nhiều phi khoảng trắng nhân vật, ví dụ:

>>> s=' \t\t ab\ncd\tef g ' 
>>> re.findall(r'\s+|\S+', s) 
[' \t\t ', 'ab', '\n', 'cd', '\t', 'ef', ' ', 'g', ' '] 
Các vấn đề liên quan