LINUX.ORG.RU

[regexp][python] Помогите!

 ,


0

0

Есть исходный текст на С содержащий строки следующего вида:
/***
#include <assert.h>
*/

/***
Func1
assert(1+2==3)
*/
int func1(int a,int b)
{
return a+b
}


требуется составить регулярное выражение, для вытаскивания содержимого всех блоков между /*** и */.
использую python модуль re.


Ответ на: комментарий от Sphinx

Вовсе нет. Это для личного пользования.

lsv
() автор топика
Ответ на: комментарий от lomereiter

на файле с вышеописанным содержанием не срабатывает. Проверял так:
import re
regexp=r"\/\*{3}(.*?)\*\/"
c_re=re.compile(regexp)


def c_scaner(path):
f_content=file(path).readlines()
f_content="".join(f_content)
print f_content
print ">>",c_re.findall(f_content,re.DOTALL)
return "c_scaner result"

c_scaner("/home/asp/foo.c")

Выводит:
/***
#include <assert.h>
*/

/***
Func1 test1
assert(1+2==3)
*/
int func1(int a,int b)
{
return a+b
}

>> []

Хотя должен вывести список из
#include <assert.h>
и
Func1 test1
assert(1+2==3)
В чем ошибка?

lsv
() автор топика
Ответ на: комментарий от lsv

О! проблема решилась. Не поскажите, в чем разница между
import re
regexp=r"\/\*{3}(.*?)\*\/"
c_re=re.compile(regexp)
и
import re
regexp=r"\/\*{3}(.*?)\*\/"
re.findall(regexp,f_content,re.DOTALL)

Первый вариант не работает, а второй работает.

lsv
() автор топика
Ответ на: комментарий от lsv

re.DOTALL¶
    Make the '.' special character match any character at all, including a newline; without this flag, '.' will match anything except a newline.

кажется так

teferiincub
()

Вопрос к знатокам: а имеет ли вообще смысл в подобных случаях использовать регулярные выражения?

Не проще (читабельнее) ли использовать банальную построчную обработку с возведением флага на '/***' и сбросом на '*/'?

Leonard
()
Ответ на: комментарий от Leonard

ИМХО такое проще регуляркой вынуть - опять же findall/finditer как-то проще смотрятся и регулярка не задротная.

teferiincub
()
Ответ на: комментарий от Leonard

> Не проще (читабельнее) ли использовать банальную построчную обработку...
В моем случаем не проще, поскольку могут попадаться и такие вещи:
/*** foo
bar
*/

lsv
() автор топика
Ответ на: комментарий от lsv

в том что ты скомпилировал регулярку и всё? import re regexp=r"\/\*{3}(.*?)\*\/" c_re=re.compile(regexp) result = c_re.findall(f_content)

vene4ka
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.