2016-06-16 3 views
1

Я имею в python в string в этом формате:разобрать строку до пустого пространства, чтобы сформировать список в Python

"" выше, чтобы показать, что это строка. Теперь я хочу разобрать этот string, пока не ударил первый '' (пустой элемент после col3 в приведенном выше примере) и сформировать список с элементами до этого. Поэтому на примере примера выше list, который я должен получить, будет ['col1', 'col2', 'col3']. Как это сделать в python?

ответ

3

Преобразовать строку в списке и использовать список операций разрезать строку на пустую строку:

>>> s = "['col1', 'col2', 'col3','', 'row1', 'row2']" 
>>> import ast 
>>> L = ast.literal_eval(s) 
>>> L 
['col1', 'col2', 'col3', '', 'row1', 'row2'] 
>>> L.index('') 
3 
>>> L[:L.index('')] 
['col1', 'col2', 'col3'] 
+0

Впервые я вижу эту библиотеку 'ast'. Кажется полезным. – GLHF

+2

@GLHF это модуль абстрактного синтаксического дерева и понимает грамматику Python. 'ast.literal_eval' - безопасная форма' eval', которая может оценивать строку, содержащую выражение Python. Он не будет выполнять '' del/s c: \ * "' например. –

+0

is 'ast.literal_eval' также преобразует их в' set, tuple' и т. Д.? – GLHF

0
import re 
import numpy as np 
l ="['col1', 'col2', 'col3','', 'row1', 'row2']" 
pattern = r"'([A-Za-z0-9_\./\\-]*)'" 
m = re.findall(pattern, l) 
mn = np.array(m) 
rslt = list(np.split(mn, np.where(mn==''))[0]) 

Выход:

rslt 
Out[75]: ['col1', 'col2', 'col3'] 

Объяснение:

In [78]: pattern = r"'([A-Za-z0-9_\./\\-]*)'" 
    ...: m = re.findall(pattern, l) 
    ...: 

In [79]: m 
Out[79]: ['col1', 'col2', 'col3', '', 'row1', 'row2'] 

In [80]: mn = np.array(m) 

In [81]: [list(x) for x in np.split(mn, np.where(mn==''))] 
Out[81]: [['col1', 'col2', 'col3'], ['', 'row1', 'row2']] 
+0

@downvoter , не могли бы вы объяснить, почему вы downvote? – MaThMaX

+0

Я не являюсь нисходящим, но, возможно, они не соглашались на использование 'numpy' и' re', когда 'ast.literal_eval' достаточно. – PaulMcG

+0

@PaulMcGuire, я знаю, что вы этого не сделали, иначе я бы спустил вас назад (ха-ха, просто шучу). Во всяком случае, 're' работает для общих случаев синтаксического анализа строк. Хотя для вас, в данном конкретном случае, 'ast' является наиболее подходящим! Я также узнал что-то новое по вашему вопросу! Благодаря! – MaThMaX

0

Я хотел бы разобрать вашу строку непосредственно с помощью json, но когда я делаю, я получаю эту ошибку:

>>> import json 
>>> json.loads("['col1', 'col2', 'col3','', 'row1', 'row2']") 

... 
ValueError: No JSON object could be decoded 

Итак, я первый заменил одиночные кавычки двойные кавычки:

>>> s = "['col1', 'col2', 'col3','', 'row1', 'row2']" 
>>> m = json.loads(s.replace("'", '"')) 
>>> m 
[u'col1', u'col2', u'col3', u'', u'row1', u'row2'] 

# find first index of empty string and the splice the list 
>>> m[:m.index('')] 
[u'col1', u'col2', u'col3'] 
Смежные вопросы