2014-01-14 4 views
0

У меня есть следующая строка:числа Расщепление и строки неоднократно

s = index (1.0000000e+00 2.0000000e+00 3.0000000e+00) _x_ (error error error) t (1.2500000e+02 1.2500000e+02 1.2500000e+02) 

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

['index', '1.0000000e+00 2.0000000e+00 3.0000000e+00', 
'_x_', 'error error error', 
't', '1.2500000e+02 1.2500000e+02 1.2500000e+02'] 

Я не могу придумать регулярное выражение для делая это.

+2

Regex является инструментом для сопоставления моделей, здесь нет каких-либо шаблон - просто строку, которую вы хотите разбить, поэтому Regex не является подходящим инструментом для задания - используйте разделение строк. – alfasin

+0

@alfasin Получил это. Спасибо, что указали это. – Anand

+0

'str.split' ожидает символ или последовательность, поэтому вам придется отфильтровывать скобки вручную позже и обрабатывать возможные варианты пробелов до/после них. Я думаю, что 're' подходит. –

ответ

2

Вот список понимание, что делает это:

[item.strip() for item in s.replace("(", ")").split(")")] 

Вот код, который в основном делает то, что вы хотите. Почти.

mylist = [] 
for item in s.replace("(", ";").replace(")", ";").split(";"): 
    mylist.append(item.strip()) 

print mylist[:-1] 

Выход:

['index', '1.0000000e+00 2.0000000e+00 3.0000000e+00', '_x_', 'error error error', 't', '1.2500000e+02 1.2500000e+02 1.2500000e+02'] 
+0

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

+1

Это, вероятно, так, но это гораздо легче понять. – jgritty

+1

как насчет '[item.strip() для элемента в s.replace (" (",") "). Split (") ")] вместо этого - один меньше' str.replace' и отказывается от ручной петли в пользу of list comprehension –

4

Вы можете использовать следующее регулярное выражение, чтобы разделить эту строку (пункт Очень последнего списка была бы пустая строка.):

import re 
    s = "index (1.0000000e+00 2.0000000e+00 3.0000000e+00) _x_ (error error error) t (1.2500000e+02 1.2500000e+02 1.2500000e+02) " 
    re.split("\s*?(?:\(|\))\s*", s) 

Это приводит к:

['index', '1.0000000e+00 2.0000000e+00 3.0000000e+00', '_x_', 'error error error', 't', '1.2500000e+02 1.2500000e+02 1.2500000e+02', ''] 

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

re.findall("(?:(?<=\()[^)]*?(?=\))|[a-z_]+)",s) 

Она должна обеспечить следующий вывод:

['index', ' 1.0000000e+00 2.0000000e+00 3.0000000e+00', '_x_', ' error error error ', 't', ' 1.2500000e+02 1.2500000e+02 1.2500000e+02 '] 
+0

@Peter: Я попросил OP разъяснить, как должна выглядеть эта строка. Я предположил, что это s = "index ...." –

1

Похожие на @ AlexKotliarov отвечают, но только расщепление на пробельных и Паренс

>>> import re 
>>> re.split(r'[\s()]+', s) 

Выход:

['index', '1.0000000e+00', '2.0000000e+00', '3.0000000e+00', '_x_', 'error', 'error', 'error', 't', '1.2500000e+02', '1.2500000e+02', '1.2500000e+02', ''] 

Explaination:

Split на один или несколько символов + в наборе [ .. ]: пробельных \s и скобкой ( & )

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