Регулярное выражение для извлечения строк из исходного кода - PullRequest
0 голосов
/ 27 мая 2009

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

Для пояснения приведу несколько примеров ввода и ожидаемого результата:

input: print("hello world, how are you?")
output: print("string")

input: print("hello" + "world")
output: print("string" + "string")

# here's the tricky part:
input: print("He told her ""how you doin?"", and she said ""I'm fine, thanks""")
output: print("string")

Я работаю в Python, но, думаю, это не зависит от языка.

РЕДАКТИРОВАТЬ: Согласно одному из ответов, это требование может не подходить для регулярного выражения. Я не уверен, что это правда, но я не эксперт. Если я попытаюсь сформулировать свое требование словами, то, что я ищу, - это найти наборы символов, которые находятся между двойными кавычками, причем даже группы смежных двойных кавычек следует игнорировать, и для меня это звучит так, как будто ДФА.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 27 мая 2009

Если вы разбираете код Python, избавьте себя от хлопот и позвольте модулю синтаксического анализатора стандартной библиотеки сделать тяжелую работу.

Если вы пишете свой собственный синтаксический анализатор для какого-то пользовательского языка, то ужасно соблазнительно начать с того, что просто соберите кучу регулярных выражений, но не делайте этого. Вы окунетесь в неразбериху. Читайте о методах разбора и делайте это правильно (wikipedia может помочь ).

Это регулярное выражение делает трюк для всех трех ваших примеров:

re.sub(r'"(?:""|[^"])+"', '"string"', original)
0 голосов
/ 27 мая 2009

В ActiveState есть очень хорошее регулярное выражение для совпадения строк . Если для вашего последнего примера это не сработает, то будет достаточно тривиально повторить группирование смежных строк в кавычках.

0 голосов
/ 27 мая 2009

Может быть:

re.sub(r"[^\"]\"[^\"].*[^\"]\"[^\"]",'"string"',input)

EDIT:

Нет, это не сработает для последнего примера.

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

Я думаю, вам придется сделать это вручную, считая " с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...