Как разделить строку в массив, игнорируя при этом внутренние массивы? - PullRequest
0 голосов
/ 07 июля 2019

У меня есть строка, похожая на следующую:

string = "hello,2,test,1,[4,something,3],1,2"

Когда я разделяю строку запятыми, я получаю следующий массив:

['hello', '2', 'test', '1', '[4', 'something', '3]', '1', '2']

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

['hello', '2', 'test', '1', '[4,something,3]', '1', '2']

Ответы [ 3 ]

2 голосов
/ 07 июля 2019

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

import re re.split(r",\s*(?![^[]*])",string)

Результат:

['hello', '2', 'test', '1', '[4,something,3]', '1', '2']

Обратите внимание, что в этом ответе не предполагается вложенных []

0 голосов
/ 07 июля 2019

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

import re

string = "hello,2,test,1,[4,something,3],1,2"
x = re.findall(r'\[[^\]]+\](?=,|\b)|[^,]+(?=,|\b)', string)

x содержит ['hello', '2', 'test', '1', '[4,something,3]', '1', '2'].

В регулярном выражении у нас есть два случая, разделенные | (или). Первый должен обрабатывать более длинные случаи [something, in, brackets], второй может обрабатывать простые случаи. В случае, если вы не знакомы с ним (?=,|\b) является положительным взглядом .

0 голосов
/ 07 июля 2019

Вот один из способов:

string = "hello,2,test,1,[4,something,3],1,2"
string2 = string.split(",")
res = []
temp = []
found = False

for item in string2:
    if (not(found)):
        if "[" in item:
            found = True
            temp = []
            temp.append(item[1:])
        else:
            res.append(item)

    else:
        if "]" in item:
            found = False
            temp.append(item[:-1])
            final = str(temp).replace("'", "")
            res.append(final)
        else:
            temp.append(item)

print(res)

Вывод:

['hello', '2', 'test', '1', '[4, something, 3]', '1', '2']
...