2016-10-07 3 views
0

У меня есть текст, разделенный запятыми.Сплит-строка, основанная на числе запятых

например:

FOO(something, BOO(tmp, temp), something else) 

Это может быть что-то еще содержат, а также строку с запятыми ...

Я хотел бы разделить текст внутри brakets обув до его элементов а затем пропустить элементы.

Что я знаю об этом FOO должно быть двух запятой.

Как я могу разделить континент FOO на его три элемента?

Примечание:что-то еще может быть BOO (ддд, ддд) или просто ддда. Я не могу взять на себя простое регулярное выражение Регель из 'Foo \ (\ W +, BOO (\ ш + \ W +), \ ш + \)'

+0

Итак, для приведенного выше примера вам нужен результат как: ['something',' BOO (tmp, temp) ',' something else'] –

ответ

0

Предполагая, что строка является Python код, который вы можете использовать анализатор для это. Если вы внимательно посмотрите на результат, вы можете согласиться с тем, что это не так плохо, как кажется на первый взгляд.

>>> from parser import * 
>>> source="FOO(something, BOO(tmp, temp), something)" 
>>> st=suite(source) 
>>> st2tuple(st) 
(257, (268, (269, (270, (271, (272, (302, (306, (307, (308, (309, (312, (313, (314, (315, (316, (317, (318, (319, (320, (1, 'FOO')), (322, (7, '('), (330, (331, (302, (306, (307, (308, (309, (312, (313, (314, (315, (316, (317, (318, (319, (320, (1, 'something')))))))))))))))), (12, ','), (331, (302, (306, (307, (308, (309, (312, (313, (314, (315, (316, (317, (318, (319, (320, (1, 'BOO')), (322, (7, '('), (330, (331, (302, (306, (307, (308, (309, (312, (313, (314, (315, (316, (317, (318, (319, (320, (1, 'tmp')))))))))))))))), (12, ','), (331, (302, (306, (307, (308, (309, (312, (313, (314, (315, (316, (317, (318, (319, (320, (1, 'temp'))))))))))))))))), (8, ')')))))))))))))))), (12, ','), (331, (302, (306, (307, (308, (309, (312, (313, (314, (315, (316, (317, (318, (319, (320, (1, 'something'))))))))))))))))), (8, ')')))))))))))))))))), (4, ''))), (4, ''), (0, '')) 
+0

Я действительно не понимаю, что я должен видеть. Что означают числа (257, 268, ...)? – Eagle

+0

Эти конкретные числа являются элементами в symbol.sym_name. 320 указывает, что что-то является «атомом». Парсер также определил для вас круглые скобки и запятые. Я думаю, вы можете использовать регулярное выражение для прохождения строки, которая ищет либо пунктуацию, либо (320, (1, «независимо»), а регулярное выражение вытаскивает нужные вам биты. И я должен был упомянуть раздел 32.4 в Руководство для Python. –

0

Вы можете использовать это регулярное выражение

,(?=(?:(?:\([^)]*\))?[^)]*)+\)$) 

разделить вашу строку в коме, бот не внутри BOO (...)

sample

0

Вы можете сделать это с regex module, который поддерживает рекурсию (полезную для работы с вложенными структурами):

import regex 

s = 'FOO(something, BOO(tmp, temp), something else)' 

pat = regex.compile(r'''(?(DEFINE) # inside a definition group 
    # you can define subpatterns to use later 
    (?P<elt>  # define the subpattern "elt" 
     [^,()]*+ 
     (?: 
      \((?&elt) (?: , (?&elt))* \) 
      [^,()]* 
     )*+ 
    ) 
) 
# start of the main pattern 
FOO\(\s* 
    (?P<elt1> (?&elt)) # capture group "elt1" contains the subpattern "elt" 
    , \s* 
    (?P<elt2> (?&elt)) # same here 
    , \s* 
    (?P<elt3> (?&elt)) # etc. 
\)''', regex.VERSION1 | regex.VERBOSE) 

m = pat.search(s) 

print(m.group('elt1')) 
print(m.group('elt2')) 
print(m.group('elt3')) 

demo

0

Если предположить, что вам нужен список элементов внутри FOO, поэтому предварительная обработка сначала

>>> s = 'FOO(something, BOO(tmp, temp), something else)' 
>>> s 
'FOO(something, BOO(tmp, temp), something else)' 
>>> s = re.sub(r'^[^(]+\(|\)\s*$','',s) 
>>> s 
' something, BOO(tmp, temp), something else' 

Использование regex модуля:

>>> regex.split(r'[^,(]+\([^)]+\)(*SKIP)(?!)|,', s) 
[' something', ' BOO(tmp, temp)', ' something else'] 
  • [^,(]+\([^)]+\)(*SKIP)(?!), чтобы пропустить образец [^,(]+\([^)]+\)
  • |, альтернативный шаблон, чтобы фактически разделить входной строки, в данном случае это ,


другое пример:

>>> t = 'd(s,sad,e),g(3,2),c(d)' 
>>> regex.split(r'[^,(]+\([^)]+\)(*SKIP)(?!)|,', t) 
['d(s,sad,e)', 'g(3,2)', 'c(d)']