2013-06-16 2 views
0

позволяет сказать, что есть таблица со следующим содержимым:Как разбить это на python?

<td>Dog,Cat,Mouse</td> 
<td>Snake,Dragon,Dinosaur,Lizard</td> 
<td>Owl,Falcon,Phoenix</td> 

и я хочу, чтобы это сделать, как это на Python:

>>>pets 
[['Dog'],['Cat'],['Mouse'],['Snake'],['Dragon'],['Dinosaur'],['Lizard'],['Owl'],['Falcon'],['Phoenix']] 

Это то, что я сумел до сих пор.

animal = table.find_all('td') 
pets = [] 
for i in animal: 
    a = re.findall('[A-Z][a-z]*',str(i)) 
    pets.append(a) 

однако, я не могу понять способ превратить

['Dog','Cat','Mouse'] 

в

['Dog'],['Cat'],['Mouse'], 

и так далее. пожалуйста помоги. Это мои первые несколько дней программирования, и я уже застрял. Спасибо заранее.

+3

Я думаю, что это [х проблема] (http://www.perlmonks.org/?node_id=542341) - почему каждый элемент будет вложен в своем собственном список? Почему бы просто не использовать плоский список значений? – l4mpi

ответ

0

Попробуйте это:

>>> my_list = ['Dog','Cat','Mouse'] 
>>> map(lambda x: [x], my_list) 
[['Dog'], ['Cat'], ['Mouse']] 
2
import re 
strs = """<td>Dog,Cat,Mouse</td> 
<td>Snake,Dragon,Dinosaur,Lizard</td> 
<td>Owl,Falcon,Phoenix</td>""" 

r = re.compile(r'<td>(.*?)</td>') 
print [[x] for m in r.finditer(strs) for x in m.group(1).split(',')] 

Это печатает:

[['Dog'], ['Cat'], ['Mouse'], ['Snake'], ['Dragon'], ['Dinosaur'], ['Lizard'], ['Owl'], ['Falcon'], ['Phoenix']] 

и поддерживает различные <td>..</td> на одной и той же линии.

+0

@bernardpaulus он может потерпеть неудачу для '' Сова, Сокол, Феникс''. –

+0

@AshwiniChaudary Да, но этот вход гораздо менее вероятен, чем ' Собака, кошка, мышь Змея, дракон, динозавр, ящерица' на той же линии. Поскольку модификация по существу является одним символом (добавление '?' После '*' в вашем регулярном выражении), я думал, что это будет интересно. Кроме того, ваше регулярное выражение 'r ' (. *)' ', не поддерживает случай, который вы указываете. Но, да, хорошо, хороший ответ в любом случае :) –

+1

@bernardpaulus Я думаю, что у вас есть хороший момент, я вернулся к вашему редактированию. Спасибо за ваше предложение. :) –

0

Изменить это:

animal = table.find_all('td') 
    pets = [] 
    for i in animal: 
     a = re.findall('[A-Z][a-z]*',str(i)) 
     pets.append(a) 

Для этого:

animal = table.find_all('td') 
    pets = [] 
    for i in animal: 
     a = re.findall('[A-Z][a-z]*',str(i)) 
     pets.append([a]) 

Вы просто не хватает двух символов [], когда вы добавления размечать каждый элемент в его собственный список во время итерации цикла.

2

Во-первых, вы должны знать, что regex (регулярные выражения) не всегда являются лучшим решением для анализа некоторых данных. Здесь, например, все ваши элементы разделены ,, поэтому способ split - это путь.

Что касается размещения ваших элементов в виде массивов с помощью одного элемента, то понимание списка - это самый простой способ сделать это. Снова: убедитесь, что вы действительно хотите/нужно сделать это. Не имеет смысла иметь набор списков с одним элементом.

Вот предложили реализация:

elements = table.find_all('td') 
pets = [] 
for e in elements: 
    # The following line is only needed if 'find_all' keeps the <td> and </td> 
    e_tagless = e[5:len(e)-5] 

    animals = e_tagless.split(',') 
    pets += [ [animal] for animal in animals ] 
+0

+1 для упоминания не использовать регулярное выражение для чего-то такого простого. Можно улучшить, поставив под сомнение необходимость добавления каждого животного в собственный список. –

+0

На самом деле я уже сделал это, спросив его (ее?), Если это то, что он действительно хочет сделать. Я отредактирую ответ, чтобы он стал яснее. – halflings

+0

Это все же лучше, чем дать ему регулярное выражение. ;) Но хорошая работа меняет это: P –

Смежные вопросы