2011-10-23 13 views
54

Mã này gần như làm những gì tôi cần nó để ..Python split() mà không cần tháo delimiter

for line in all_lines: 
    s = line.split('>') 

Trừ nó loại bỏ tất cả các '>' delimiters.

Vì vậy,

<html><head> 

Hóa vào

['<html','<head'] 

Có cách nào để sử dụng split() phương pháp nhưng giữ dấu phân cách, thay vì loại bỏ nó?

Với những kết quả này ..

['<html>','<head>'] 
+17

này không thực sự trả lời câu hỏi của bạn, nhưng nếu bạn đang cố gắng phân tích cú pháp HTML trong Python, tôi khuyên bạn nên [Beautiful Soup] (http://www.crummy.com/software/BeautifulSoup/). –

+2

Xem thêm [Trong Python, làm cách nào để tách một chuỗi và giữ các dấu tách?] (Http://stackoverflow.com/questions/2136556/in-python-how-do-i-split-a-string-and- giữ dấu phân cách). – outis

Trả lời

32
d = ">" 
for line in all_lines: 
    s = [e+d for e in line.split(d) if e] 
+3

Điều đó hoạt động hoàn hảo ... nhưng tôi không hoàn toàn hiểu những gì đang xảy ra. – some1

+2

@ some1 về cơ bản nó lặp lại kết quả của phép chia và thêm dấu phân cách vào. "S là một danh sách, trong đó mỗi phần tử trong danh sách đó là e + d, trong đó e là các phần tử trong kết quả của line.split (d), nhưng chỉ khi e không rỗng " – JHixson

+7

Điều này thêm dấu tách cho tất cả các phần tử trong danh sách kết quả, bao gồm danh sách phần tử đơn không có dấu phân tách ... Điều gì sẽ xảy ra nếu bạn _only_ muốn dấu phân tách được nối vào phần đầu tiên của phần tách yếu tố? –

1

Chỉ cần chia nó, sau đó cho mỗi phần tử trong mảng/danh sách (ngoài tác phẩm mới nhất) thêm một dấu ">" đến nó.

+0

Điều gì về trường hợp của ">>" nó sẽ chỉ trở thành ">" – paulm

10

Làm thế nào về điều này:

import re 
s = '<html><head>' 
re.findall('[^>]+>', s) 
23

Nếu bạn đang phân tích cú pháp HTML với phần chia nhỏ, bạn có nhiều khả năng làm việc đó sai, trừ khi bạn đang viết một kịch bản one-shot nhằm cố định và an toàn tệp nội dung. Nếu nó có nghĩa vụ phải làm việc trên bất kỳ đầu vào HTML, làm thế nào bạn sẽ xử lý một cái gì đó như <a title='growth > 8%' href='#something'>?

Dù sao, các công việc sau cho tôi:

>>> import re 
>>> re.split('(<[^>]*>)', '<body><table><tr><td>')[1::2] 
['<body>', '<table>', '<tr>', '<td>']