2012-06-11 31 views
67

Tôi có đầu ra của lệnh trong dạng bảng. Tôi đang phân tích cú pháp đầu ra này từ một tệp kết quả và lưu nó trong một chuỗi. Mỗi phần tử trong một hàng được phân tách bằng một hoặc nhiều ký tự khoảng trắng, do đó tôi sử dụng cụm từ thông dụng để khớp với 1 hoặc nhiều khoảng trắng và chia tách nó. Tuy nhiên, một khoảng trắng được chèn vào giữa mọi phần tử:Tách chuỗi dựa trên cụm từ thông dụng

>>> str1="a b  c  d" # spaces are irregular 
>>> str1 
'a b  c  d' 
>>> str2=re.split("()+", str1) 
>>> str2 
['a', ' ', 'b', ' ', 'c', ' ', 'd'] # 1 space element between!!! 

Có cách nào tốt hơn để làm điều này không?

Sau mỗi lần tách str2 được nối vào danh sách.

+0

Tôi đã bỏ phiếu này xuống. Lý do là trong khi câu hỏi chính nó là có liên quan ví dụ nhất định là không đủ cứng để thực sự yêu cầu giải pháp được yêu cầu. Một regex sẽ được yêu cầu nếu bạn có ví dụ khối từ, khối số và bạn muốn tách chúng thành các biến khác nhau. – erikbwork

+0

@erikbwork Tôi muốn xóa mục không mong muốn trong chuỗi kết quả '' str2'' – user2763554

+0

Có và bạn có thể đạt được điều đó bằng cách sử dụng 'str1.split()'. Không cần regex. – erikbwork

Trả lời

95

Bằng cách sử dụng (, ), bạn đang chụp nhóm, nếu bạn chỉ đơn giản là loại bỏ chúng bạn sẽ không có vấn đề này.

>>> str1 = "a b  c  d" 
>>> re.split(" +", str1) 
['a', 'b', 'c', 'd'] 

Tuy nhiên, không cần regex, str.split mà không có bất kỳ dấu phân cách nào được chỉ định sẽ chia nhỏ khoảng trắng này cho bạn. Đây sẽ là cách tốt nhất trong trường hợp này.

>>> str1.split() 
['a', 'b', 'c', 'd'] 

Nếu bạn thực sự muốn regex bạn có thể sử dụng này ('\s' đại diện cho khoảng trắng và nó rõ ràng hơn):

>>> re.split("\s+", str1) 
['a', 'b', 'c', 'd'] 

hoặc bạn có thể tìm thấy tất cả các ký tự không khoảng trắng

>>> re.findall(r'\S+',str1) 
['a', 'b', 'c', 'd'] 
+0

Cảm ơn .... Tất cả ba câu trả lời đều hoạt động !!! nhưng cái nào sẽ tốt hơn ?? – user2763554

+3

Hãy đơn giản. 'str.split' chắc chắn là tốt nhất: D – jamylak

+0

Làm thế nào tôi có thể sử dụng điều này nếu tôi có một chuỗi bắt đầu và kết thúc bằng withspace. ví dụ: 'a b c de'. Đối với điều này, đầu ra xuất hiện dưới dạng '['', 'a', 'b', 'c', 'de', '']' –

5

Khi bạn sử dụng re.split và mẫu phân tách chứa nhóm chụp, các nhóm sẽ được giữ lại ở đầu ra. Nếu bạn không muốn điều này, hãy sử dụng nhóm không chụp để thay thế.

+0

Cảm ơn .... Tất cả ba câu trả lời đều hoạt động! nhưng cái nào sẽ tốt hơn ?? – user2763554

+1

Sử dụng 'str.split' có lẽ tốt hơn cho ví dụ của bạn. Tôi chỉ muốn giải thích lý do tại sao bạn nhận được hành vi mà bạn làm. – BrenBarn

13

Phương pháp str.split sẽ tự động xóa tất cả các khoảng trắng giữa các mục:

>>> str1 = "a b  c  d" 
>>> str1.split() 
['a', 'b', 'c', 'd'] 

Documents đang ở đây: http://docs.python.org/library/stdtypes.html#str.split

+0

Cảm ơn .... Tất cả ba câu trả lời đều hoạt động! nhưng cái nào sẽ tốt hơn ?? – user2763554

+0

@ GururajY.S .: 'str.split()' có lẽ là sự lựa chọn tốt nhất cho một thứ gì đó như là nhiệm vụ nhẹ như thế này. –

1

của nó rất đơn giản thực sự. Hãy thử điều này:

str1="a b  c  d" 
splitStr1 = str1.split() 
print splitStr1 
+1

Tôi sẽ +1 điều này nhưng bạn đang sử dụng dấu chấm phẩy xấu xí. – jamylak

+3

@jamylak Lol. Tôi sẽ thay đổi chúng. :) Thói quen sử dụng java và python! – damned

+0

Cảm ơn .... Tất cả ba câu trả lời đều hoạt động! nhưng cái nào sẽ tốt hơn ?? – user2763554

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