регулярное выражение соответствия внешних скобок в Python - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть некоторая строка данных конфигурации f5, отформатированная с помощью вложенных фигурных скобок, следующим образом:

profiles {
    /Common/http { }
    /Common/serverssl {
        context serverside
    }
    /Common/tcp { }
    SOME_CRED_MGMT.DOMAIN_some_date {
        context clientside
    }
}
rules {
    /Common/X-FORWARDED-FOR
}
snat {
    pool SOME_SNAT.POOL
    type snat
}

Я хочу получить из указанной выше группы что-то вроде:

some_list = ["profiles{..}", "rules{..}", "snat{..}"]

После поиска я нашел что-то вроде (в JS):

profiles {([\s\S]*?)^}

И также похожее (в PCRE):

({((?(?={)(?R)|[^}])*)})

Но они не работают для Python.Как сделать подобное в Python?

1 Ответ

0 голосов
/ 24 февраля 2019

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

.+ {[\s\S]*?^}

Я заменил profile на .*, чтобы он не совпадал только с profile { ... }.Я также сделал группу не захватывающей, так как вас не волнует, что находится внутри фигурных скобок.Вы просто хотите все это.

И тогда вы можете позвонить findall, чтобы получить список, который вы хотите:

matches = re.findall(r".+ {(?:[\s\S]*?)^}", test_str, re.MULTILINE)
...