2017-01-25 3 views
2

Я не могу понять это из-за жизни меня. Python 2.7.создание регулярного выражения для определения словарей

У меня есть конфигурационный файл, который что-то вроде

define something { 
    var val1 
    var val2 
} 

define something_else { 
    var val3 
    var val4} 
... 

и я хочу, чтобы соответствовать каждый «объект», начиная с «определить». Я хочу, чтобы в основном удалить один из этих объектов из файла, если последовательность внутри объекта.

До сих пор я

re.compile(r"(define.+\{\n)((.*\n)*)(\})")

, но это не соответствует все до последнего индекса, а также не соответствует } характер.

Я также пробовал re.compile(r"(define.+\{\n)((\s*\S*)*)(\})"), но это тоже не работает. По какой-то причине регулярное выражение захватывает все и вообще не будет закрывать скобу.

Я понимаю, что линия только с закрывающей скобкой может быть либо

\n} или } или (some number of spaces) } или var valx (some number of spaces) }

, но я не думаю, что должно иметь значения.

Кроме того, файлы конфигурации предварительно проверены, чтобы убедиться, что синтаксис var/val верен.

ответ

4

Вы должны сказать + классификатору вести себя в нежадном пути и идти только на первый соответствующий }:

re.findall(r'define [^{]+{[^}]+?}', data) 
# ['define something {\n var val1\n var val2\n}', 
# 'define something_else {\n var val3\n var val4}'] 
+1

ах, 'Добавление? после того, как квалификатор делает его исполнением в неживой или минимальной форме; как можно меньше символов. Полностью не использовал это в свою пользу. Также помогло увидеть, как вы минимизировали мое соответствие. Спасибо! – frei

Смежные вопросы