2014-01-02 5 views
0

Я хочу, чтобы разбить строкуРазбиение строки в списки и расщепление снова

" 510  -9999999 9    99   12    5    [3, 0]  []   [6]  " 

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

['510', '-9999999', '9', '99', '12', '5', '[3,', '0]', '[]', '[6]'] 

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

['510', '-9999999', '9', '99', '12', '5', '[3,0]', '[]', '[6]']. 

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

Я мог бы найти '[', а затем искать ']', чтобы закрыть список, но, поскольку я не знаю длины любого из списков, это кажется неэффективным способом делать вещи.

Любая помощь очень ценится!

+2

Обратитесь к [this] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Я считаю, что это поможет. –

+0

Могут ли эти списки быть вложенными? – Hyperboreus

+0

paging @Paul McGuire для решения pyparsing. – wim

ответ

0

Существует всегда регулярное выражение, но вы можете сделать это по дешевке, как это

>>> import shlex 
>>> shlex.split(s.replace('[','"[').replace(']',']"')) 
['510', '-9999999', '9', '99', '12', '5', '[3, 0]', '[]', '[6]'] 

Надлежащее решение было бы использовать pyparsing модуль, или даже лучше контролировать источник входного сигнала, чтобы дать вам что-то более осмысленное, как JSON.

+0

Это отлично работает, спасибо! Я новичок в Python и все еще пытаюсь справиться с импортом/экспортом беспорядочных наборов данных. – user3119998

0

Если списки не могут быть вложенными, то я думаю, что это можно Preprocess строку с:

s = " 510  -9999999 9    99   12    5    [3, 0]  []   [6]  " 

opened = False 
s_new = "" 
for i in s: 
    if i == "[": 
     opened = True 
    if i == "]": 
     opened = False 
    if not opened or (opened and i != " "): 
     s_new += i 

А затем разделить его в список:

l = s_new.split() 
0

Если листы не вложены, вы можете попробовать это:

def mysplit (a): 
    return re.split(' +', re.sub('\\[(.*?)\\]', lambda m: '[{}]'.format(m.groups()[0].replace(' ', '')), a)) 
Смежные вопросы