1.О регулярных выражениях Python 2019.02.21
Python обновляет модуль regex
.Последний выпуск выпущен 21 февраля 2019 года. С ним можно ознакомиться здесь: https://pypi.org/project/regex/
. Он заменит модуль re
вовремя.Сейчас вам нужно установить его вручную с помощью pip install regex
и импортировать модуль regex
вместо re
.
2.Новая функция регулярных выражений
Самая крутая функция в новейшей версии - Рекурсивные шаблоны .Подробнее об этом здесь: https://bitbucket.org/mrabarnett/mrab-regex/issues/27
Эта функция позволяет найти подходящие паретезы ( .. )
или фигурные скобки { .. }
.Следующая веб-страница объясняет, как это сделать: https://www.regular -expressions.info / recurse.html # balance Я цитирую:
Основная цель рекурсии - сопоставить сбалансированные конструкцииили вложенные конструкции.Общее регулярное выражение: b(?:m|(?R))*e
, где b
- это то, что начинает конструкцию, m
- это то, что может происходить в середине конструкции, и e
- это то, что может происходить в конце конструкции.Для получения правильных результатов никакие два из b
, m
и e
не должны соответствовать одному и тому же тексту.Для повышения производительности вы можете использовать атомарную группу вместо группы без захвата: b(?>m|(?R))*e
.
Обычное использование в реальных условиях - сопоставление сбалансированного набора скобок.\((?>[^()]|(?R))*\)
соответствует одной паре скобок с любым текстом между ними, включая неограниченное количество скобок, при условии, что все они правильно спарены.
3,Мой вопрос
Я экспериментирую с соответствующими фигурными скобками { .. }
.Поэтому я просто применяю регулярное выражение из приведенной выше веб-страницы, но заменяю (
на {
.Это дает мне следующее регулярное выражение:
{(?>[^{}]|(?R))*}
Я пробую на https://regex101.com и получаю прекрасные результаты (*) :

Я хочу сделать еще один шаг вперед и найти определенный набор соответствующих фигурных скобок, например:
MEMORY\s*{(?>[^{}]|(?R))*}
Результат отличный:

Но когда я пытаюсь
SECTIONS\s*{(?>[^{}]|(?R))*}
НичегонайденНе совпадает.Единственная разница между деталями MEMORY{..}
и SECTIONS{..}
заключается в том, что последняя имеет несколько вложенных фигурных скобок.Так что проблема должна быть найдена там.Но я не знаю, как это исправить.
* Примечание 1:
Вкл. https://regex101.com, Вы можете выбрать вкус регулярного выражения.Обычно я выбираю Python, но на этот раз я выбрал PCRE (PHP), потому что сайт regex101 еще не применил последнее обновление регулярных выражений Python.
Чтобы подтвердить результаты, я также пробую это в простом Python-сеансе в моем терминале с такими командами, как:
• import regex
• p = regex.compile(r"...")
• text = """ ... """
• p.findall(text)
* Примечание 2:
Текст, который я использую для тестирования:
MEMORY
{
/* Foobar */
consectetur adipiscing elit,
sed do eiusmod tempor incididunt
}
Lorem ipsum dolor sit amet,
SECTIONS
{
ut labore et dolore magna aliqua.
/* Foobar */
FOO
{
/* Foobar */
Ut enim ad minim veniam,
quis nostrud exercitation ullamco
}
BAR
{
/* Foobar */
laboris nisi
ut
}
aliquip ex ea commodo consequat.
}
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.