следующим выражением хорошо работает извлекая часть data
строки, которая начинается со словом Block
с последующим открывающей скобкой {
и заканчивая закрывающую скобкой «}»:Как использовать Regex с многострочным
data ="""
Somewhere over the rainbow
Way up high
Block {
line 1
line 2
line 3
}
And the dreams that you dreamed of
Once in a lullaby
"""
regex = re.compile("""(Block\ {\n\ [^\{\}]*\n}\n)""", re.MULTILINE)
result = regex.findall(data)
print result
который возвращает :
['Block {\n line 1\n line 2\n line 3\n}\n']
Но если есть другая фигурная скобка внутри блок части строки экспрессирующих брейки возвращающихся пустой список:
data ="""
Somewhere over the rainbow
Way up high
Block {
line 1
line 2
{{}
line 3
}
And the dreams that you dreamed of
Once in a lullaby
Block {
line 4
line 5
{{
}
line 6
}
Somewhere over the rainbow
Blue birds fly
And the dreams that you dreamed of
Dreams really do come true ooh oh
"""
Как изменить это регулярное выражение, чтобы сделать его игнорировать скобки, которые находятся внутри блоков, и все же каждый блок возвращается как отдельное юридическое лицо в result
списка (так что каждый блок может быть доступна отдельно)?
На самом деле '[^ {}] *' предотвращает, чтобы соответствовать любой открывающую фигурную скобку. Обратите внимание, что флаг MULTILINE - это не то, что вы думаете. * (это не для совпадающих строк, которые распространяются по нескольким строкам, это только изменяет значение якорей '^' и '$'. Чтобы точка совпадала с символами новой строки, флаг DOTALL) * –
Поскольку вы редактировали свой вопрос : эта проблема не может быть решена с помощью модуля re, вам нужен модуль * regex *, который обрабатывает рекурсию. Обратите внимание, что вам нужно выбрать поведение по умолчанию для неопределенных случаев. –