соответствие содержимого крайних скобок python - PullRequest
0 голосов
/ 05 августа 2020

Я хотел бы использовать выражение регулярного выражения в Python, которое соответствует чему-то вроде r '{. *?}' Или в простых фигурных скобках sh английского языка вместе со всем, что внутри них. (Меня интересуют только самые внешние фигурные скобки, и я бы хотел проигнорировать внутренние фигурные скобки)

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

Примечание r '{. *}' не является решением, потому что в анализируемом тексте есть несколько групп совпадающих внешних фигурных скобок.

Например, если текст был:

struct my_struct{
    double d;
    struct {int i;, char c;} s;
};

, я бы хотел, чтобы выражение соответствовало:

{
    double d;
    struct{int i; char c;} s;
}

Любые указатели на то, как учитывать вложенные фигурные скобки, будут оценены. Обратите внимание, что я ищу тот, в котором пробелы не имеют никакого значения. Решения, которые говорят, что не используют регулярное выражение, не используют Python или go по-другому, бесполезны, поскольку это часть более крупного выражения регулярного выражения.

1 Ответ

1 голос
/ 05 августа 2020

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

\{(?:[^{}]+|(?R))+\}

В Python это может быть

import regex as re

rx = re.compile(r'\{(?:[^{}]+|(?R))+\}')

for match in rx.finditer(you_data_as_string):
    print(match.group(0))

См. демонстрацию на regex101.com .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...