2011-08-11 2 views
2

Как бы написать регулярное выражение, которое удаляет все комментарии, которые начинаются с # и остановить в конце линии - но в то же время исключить первые две строки, которые говорятпитон регулярное выражение, чтобы удалить комментарии

#!/usr/bin/python 

и

#-*- coding: utf-8 -*- 
+3

Комментарии дон Не замедляй свой код. Почему вы хотите удалить их? – agf

+0

У вас нет :). По крайней мере, не с простым регулярным выражением. Рассмотрим следующее: 's = 'not # a # comment!'' Или this: 's =" "" \ n foo # \ n bar "" "' (где '\ n' - фактические разрывы строк) –

+0

@ agf, чтобы сделать вещи более трудными для следующего человека, чтобы работать над кодом! – bgw

ответ

4

Вы можете удалить комментарии, проанализировав код Python с помощью tokenize.generate_tokens. Ниже приведен слегка измененный вариант this example from the docs:

import tokenize 
import io 

def nocomment(s): 
    result = [] 
    g = tokenize.generate_tokens(io.BytesIO(s).readline) 
    for toknum, tokval, _, _, _ in g: 
     # print(toknum,tokval) 
     if toknum != tokenize.COMMENT: 
      result.append((toknum, tokval)) 
    return tokenize.untokenize(result) 

with open('script.py','r') as f: 
    content=f.read() 

print(nocomment(content)) 

Например:

Если script.py содержит

def foo(): # Remove this comment 
    ''' But do not remove this #1 docstring 
    ''' 
    # Another comment 
    pass 

то выход nocomment является

def foo(): 
    ''' But do not remove this #1 docstring 
    ''' 

    pass 
+0

Мне просто интересно: насколько хорошо эта ручка напоминает лишние пробелы? – bgw

+1

@PiPeep: пример того, как tokenize может обрабатывать пробелы, см. В [reindent.py] (http://svn.python.org/projects/python/trunk/Tools/scripts/reindent.py). – unutbu

1

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

Я искал бы python's built-in code parsing modules за помощью в этом.

0
sed -e '1,2p' -e '/^\s*#/d' infile 

Затем заверните это в звонок subprocess.Popen.

Однако не замените настоящий парсер! Почему это будет интересно? Ну, предположим, что этот сценарий Python:

output = """ 
This is 
#1 of 100""" 

Бум, любое решение без разбора мгновенно нарушает ваш скрипт.

+0

Почему бы просто не использовать пакет python 're' в примере, а чем требовать инструмент, зависящий от платформы? – bgw

Смежные вопросы