Регулярное выражение python для соответствия макросу многострочного препроцессора

Далее следует регулярное выражение, которое я написал для соответствия многострочным макросам препроцессора в коде C / C++. Я ни в коем случае не гуру регулярных выражений, поэтому был бы рад любым советам, как я могу это сделать лучше.

Вот регулярное выражение:

\s*#define(.*\\n)+[\S]+(?!\)

Он должен соответствовать всему этому:

#define foo(x) if (x) \
doSomething(x)

Но только некоторые из них (не должны соответствовать следующей строке кода:

#define foo(x) if (x) \
doSomething(x)
normalCode();

А также не должны совпадать с однострочными макросами препроцессора.

Я почти уверен, что приведенное выше регулярное выражение работает, но, как я уже сказал, вероятно, есть лучший способ сделать это, и я полагаю, что есть способы его сломать. Кто-нибудь может что-нибудь предложить?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
0
1 376
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это простая тестовая программа, которую я придумал:

#!/usr/bin/env python

TEST1 = """
#include "Foo.h"
#define bar foo\
    x
#include "Bar.h"
"""

TEST2 = """
#define bar foo
#define x 1 \
    12 \
    2 \\ 3
Foobar
"""

TEST3 = """
#define foo(x) if (x) \
doSomething(x)
"""

TEST4 = """
#define foo(x) if (x) \
doSomething(x)
normalCode();
"""

import re
matcher = re.compile(r"^[ \t]*#define(.*\\n)+.*$",re.MULTILINE)

def extractDefines(s):
    mo = matcher.search(s)
    if not mo:
        print mo
        return
    print mo.group(0)

extractDefines(TEST1)
extractDefines(TEST2)
extractDefines(TEST3)
extractDefines(TEST4)

Я использовал:

r"^[ \t]*#define(.*\\n)+.*$"

Очень похоже на одно использованное использование, изменения:

  1. [\ t] Чтобы избежать перевода строки в начале определения.
  2. Я полагаюсь на + быть жадный, поэтому я могу использовать простой. * $ at конец, чтобы получить первую строку определить, что не заканчивается на \

start        = r"^\s*#define\s+"
continuation = r"(?:.*\\n)+"
lastline     = r".*$"

re_multiline_macros = re.compile(start + continuation + lastline, 
                                 re.MULTILINE)

Другие вопросы по теме