2015-08-05 2 views
2

У меня есть регулярное выражение, которое игнорирует многострочные комментарии, которые начинаются с/* ... */ Но не работает с линиями, которые начинаются с //вырезают комментарии C/C++ из исходного файла с помощью питона

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

pattern = r""" 
         ## --------- COMMENT --------- 
     /\*    ## Start of /* ... */ comment 
     [^*]*\*+   ## Non-* followed by 1-or-more *'s 
     (    ## 
     [^/*][^*]*\*+ ## 
     )*    ## 0-or-more things which don't start with/
         ## but do end with '*' 
    /    ## End of /* ... */ comment 
    |     ## -OR- various things which aren't comments: 
     (    ## 
         ## ------ " ... " STRING ------ 
     "    ## Start of " ... " string 
     (    ## 
      \\.   ## Escaped char 
     |    ## -OR- 
      [^"\\]  ## Non "\ characters 
     )*    ## 
     "    ## End of " ... " string 
     |    ## -OR- 
         ## 
         ## ------ ' ... ' STRING ------ 
     '    ## Start of ' ... ' string 
     (    ## 
      \\.   ## Escaped char 
     |    ## -OR- 
      [^'\\]  ## Non '\ characters 
     )*    ## 
     '    ## End of ' ... ' string 
     |    ## -OR- 
         ## 
         ## ------ ANYTHING ELSE ------- 
     .    ## Anything other char 
     [^/"'\\]*  ## Chars which doesn't start a comment, string 
     )    ## or escape 
    """ 
+0

Что вы используете это? Нужно ли регулярное выражение? –

+0

В этот момент вы можете перестать использовать только регулярное выражение (многострочные комментарии не являются контекстно-зависимыми грамматиками). Я использовал собственный парсер для поиска необработанных строк в исходных файлах C/C++: https://github.com/lucasg/MSVCUnicodeUpdater/blob/master/sed.py – lucasg

+0

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

ответ

1

Если вы планируете использовать текущее регулярное выражение, вот что вы можете сделать, чтобы соответствовать //... комментариев:

Ниже этого:

/    ## End of /* ... */ comment 

Добавить это:

|     ## OR it is a line comment with // 
    \s*//.*   ## Single line comment 

См demo

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