2010-04-23 4 views
2

Я пытаюсь использовать регулярное выражение для извлечения комментариев в заголовке файла.Вопрос с регулярным выражением

Например, исходный код может выглядеть следующим образом:

//This is an example file. 
//Please help me. 

#include "test.h" 
int main() //main function 
{ 
    ... 
} 

То, что я хочу, чтобы извлечь из кода первые две строки, т.е.

//This is an example file. 
//Please help me. 

Любая идея?

+0

Как определяется «заголовок файла»? Состоит ли из всех прокомментированных строк до первой строки без комментариев? Или до первого 'include' (который может не всегда существовать)? Разве пустые строки отмечают конец заголовка? Являются ли пробелы или вкладки перед '//' разрешенными? Разрешены ли другие виды комментариев '/ * * /'? –

ответ

2
>>> code="""//This is an example file. 
... //Please help me. 
... 
... #include "test.h" 
... int main() //main function 
... { 
... ... 
... } 
... """ 
>>> 
>>> import re 
>>> re.findall("^\s*//.*",code,re.MULTILINE) 
['//This is an example file.', '//Please help me.'] 
>>> 

Если вам нужно только совместить непрерывные строки комментариев вверху, вы можете использовать следующее.

>>> re.search("^((?:\s*//.*\n)+)",code).group().strip().split("\n") 
['//This is an example file.', '//Please help me.'] 
>>> 
+1

Это даст все строки комментариев в файле. Он не будет извлекать только заголовок. – Stephen

+0

@Stephen, я добавил для этого еще одно регулярное выражение. – YOU

5

Зачем использовать регулярное выражение?

>>> f = file('/tmp/source') 
>>> for line in f.readlines(): 
... if not line.startswith('//'): 
...  break 
... print line 
... 
+1

Regexp должен быть * последним * курортом. По моему опыту, 95% использования регулярного выражения, которое я видел, можно упростить таким же образом, как здесь представлен Стивен. – Escualo

+0

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

+0

Строка начинается с "//" ... egad. – 2010-04-24 02:36:15

1

это не просто получить первые 2 строки комментария, но Mulitline и // комментарии на спине, а также. Это не то, что вам нужно.

data=open("file").read() 
for c in data.split("*/"): 
    # multiline 
    if "/*" in c: 
     print ''.join(c.split("/*")[1:]) 
    if "//" in c: 
     for item in c.split("\n"): 
      if "//" in c: 
      print ''.join(item.split("//")[1:]) 
+0

Это не имеет смысла для меня, почему только первые 2 строки, во всяком случае +1 – YOU

0

расширить контекст в ниже соображения

  1. пространства перед // ...
  2. пустые строки между каждым // ... линия

import re 

code = """//This is an example file.  
a 
    // Please help me. 

// ha 

#include "test.h" 
int main() //main function 
{ 
    ... 
}""" 

for s in re.finditer(r"^(\s*)(//.*)",code,re.MULTILINE): 
    print(s.group(2)) 

>>> 
//This is an example file.  
// Please help me. 
// ha 
Смежные вопросы