2014-01-29 3 views
2

Мой вопрос - это вариант для this one. Кажется, я не могу это понять.Python: Разделить строку по шаблону

given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq" 
expected = ["{abc, xyz}", "123", "{def, lmn, ijk}", "{uvw}", "opq"] 

Как и в приведенном выше примере, элемент в expected может быть {..., ...} или просто другой string.

Большое спасибо заранее.

+2

Если фигурные скобки могут быть вложенными, вы не можете разделить его с помощью регулярных выражений (по крайней мере, не в его «чистой «форма»), потому что это не контекстно-свободный грамматик. – shx2

ответ

3

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

>>> s= "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq" 
>>> re.findall(r",?\s*(\{.*?\}|[^,]+)",s) 
['{abc, xyz}', '123', '{def, lmn, ijk}', '{uvw}', 'opq'] 
+0

Может быть стоит отметить, почему вложенные фигурные скобки, вероятно, не могут быть решены с использованием регулярного выражения ... – Fenikso

+0

Как отмечено выше, shx2, язык с вложенными фигурными скобками не имеет контекста и требует решения автомата выталкивания. Регулярные выражения в Python - это более или менее реализация регулярных языков, анализируемых конечными автоматами и, следовательно, менее мощная. – Fenikso

+0

@ Xavier_Combelle Спасибо! – fatman13

0

Может ли следующее предоставить вам то, что вы ищете?

import re 
given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq" 
expected = re.findall(r'(\w+)', given) 

Я побежал, что в стержне и получил:

>>> import re 
>>> given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq" 
>>> expected = re.findall(r'(\w+)', given) 
>>> expected 
['abc', 'xyz', '123', 'def', 'lmn', 'ijk', 'uvw', 'opq'] 
+0

Не так, 'abc' и 'xyz' не должны быть отдельными словами, если они находятся в одном наборе скобок, например. –

0

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

given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq" 
regex = r",?\s*(\{.*?\}|[^,]+)" 

print re.findall(regex,given) 

OP: ['{abc, xyz}', '123', '{def, lmn, ijk}', '{uvw}', 'opq'] 

Просто импортируйте модуль re. и делать то же самое, что и ссылка. Это будет соответствовать чему-либо внутри фигурных скобок {} и любой струны.

+0

вам нужно re.findall где-то все, что у вас есть, это всего лишь кортеж –

+0

Он уже дал ссылку, которая объясняет все остальное. Разве это не –

1
given = "{abc,{a:b}, xyz} , 123 , {def, lmn, ijk}, {uvw}, opq" 
#expected = ["{abc, xyz}", "123", "{def, lmn, ijk}", "{uvw}", "opq"] 
tmp_l = given.split(',') 
tmp_l = [i.strip() for i in tmp_l] 
result_l = [] 
element = '' 
count = 0 
for i in tmp_l: 
    if i[0] == '{': 
     count += 1 
    if i[-1] == '}': 
     count -= 1 
    element = element + i + ',' 
    if count == 0: 
     element = element[0:-1] 
     result_l.append(element) 
     element = '' 

print str(result_l) 

это один может обрабатывать вложенные фигурные скобки, хотя это, кажется, не так элегантно ..

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