2015-10-22 2 views
1

У меня есть следующая строка заголовка (шаблон):Разделить строку с пробелами после шаблона

Port   Name    Status Vlan  Duplex Speed Type 

и строка ул:

Eth1/2  trunk to dg-qwu-29 connected trunk  full 1000 1/10g 

Используя заголовок, как могу ли я str str на следующий список?

[Eth1/2, trunk to dg-qwu-29, connected, trunk, full, 1000, 1/10g] 
+0

что вы имеете в виду * стрип ул *? – styvane

+0

полоса в смысле функции Python. В настоящее время str.strip() даст [Eth1/2, trunk, to, dg-qwu-29, connected, trunk, full, 1000, 1/10g], но это не соответствует моему шаблону. –

+0

Что дает '.split ('\ t')' give? –

ответ

1

Далее предполагается, что строки и заголовки следуют пробельные маски. То есть текст заголовка выравнивается со столбцами строк.

import re 
header = "Port   Name    Status Vlan  Duplex Speed Type" 
row = "Eth1/2  trunk to dg-qwu-29 connected trunk  full 1000 1/10g" 
# retrieve indices where each header title begins and ends 
matches = [(m.group(0), (m.start(), m.end()-1)) for m in re.finditer(r'\S+', header)] 
b,c=zip(*matches) 
# each text in the row begins in each header title index and ends at most before the index 
# of the next header title. strip() to remove extra spaces 
items = [(row[j[0]:(c[i+1][0] if i < len(c)-1 else len(row))]).strip() for i,j in enumerate(c)] 
print items 

Приведенные выше результаты:

['Eth1/2', 'trunk to dg-qwu-29', 'connected', 'trunk', 'full', '1000', '1/10g'] 

Редактировать: поиск Указатель от https://stackoverflow.com/a/13734572/1847471

+0

Спасибо. Именно то, что мне нужно. –

0

Вы не предоставили информацию о том, как значения столбцов отформатированы, то есть разделитель, управляющие символы и строки котировку. Основываясь на вашем примере, я бы сказал, что сложной частью является столбец имен, который вам нужно будет извлечь из исключения. Это быстрый способ сделать это, вы можете начать оттуда:

# Get the first element 
first = str.split()[0] 
# Get the last part of the string, excluding name 
last = str.split()[::-1][0:5] 
last = last[::-1] 
# Get the name column via exclusion of the two parts previously calculated 
middle = str.split(first)[1].split(last[0])[0].strip() 
r_tmp = [first, middle] 
result = r_tmp + last 
print result