Я создаю программу для автоматизации написания некоторого кода на C (я пишу для синтаксического анализа строк в одноименных перечислениях) Обработка C строк не так велика , Так что некоторые люди придирались ко мне, чтобы попробовать python.Использование regex для удаления комментариев из исходных файлов
Я сделал функцию, которая должна удалить C-стиль /* COMMENT */
и //COMMENT
из строки: Вот код:
def removeComments(string):
re.sub(re.compile("/\*.*?\*/",re.DOTALL) ,"" ,string) # remove all occurance streamed comments (/*COMMENT */) from string
re.sub(re.compile("//.*?\n") ,"" ,string) # remove all occurance singleline comments (//COMMENT\n) from string
Так что я попробовал этот код из.
str="/* spam * spam */ eggs"
removeComments(str)
print str
И это, по-видимому, ничего не делало.
Любые предложения относительно того, что я сделал неправильно?
Там поговорка Я слышал пару раз:
Если у вас есть проблемы, и вы пытаетесь решить с Regex вы в конечном итоге с двумя проблемами.
EDIT: Оглядываясь на эти годы спустя. (после того, как я получил еще немного опыта синтаксического анализа)
Я думаю, что регулярное выражение, возможно, было правильным решением. И простое регулярное выражение используется здесь «достаточно хорошо». Возможно, я не подчеркнул этого в вопросе. Это был отдельный файл. У этого не было сложных ситуаций. Я думаю, что было бы намного меньше обслуживания, чтобы файл анализировался достаточно просто для регулярного выражения, чем для усложнения регулярного выражения, в нечитаемый суп символа.
Существует только один разумный ответ: http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html. Он говорил о другом языке, но его заключение остается в силе. –
@Jerry - Строго говоря, вы часто можете угадать разумный предел гнездования и определить правильное приближение языка. В любом случае у многих компиляторов есть ограничение на размещение комментариев. Но - какой предел безопасен? Кроме того, я не хочу отлаживать регулярное выражение. Хорошая связь в любом случае. – Steve314
@ Steve314: вы можете догадаться о разумном пределе вложенности (например, в C, комментарии просто вообще не гнездятся), но это мало помогает. Только для очевидного примера разделитель комментариев в строковом литерале не учитывается, но разделитель комментариев, разбитый по строкам (с обратной косой чертой между символами) * делает * подсчет. Принимая во внимание правильно в RE, в лучшем случае нетривиально. –