Регулярное выражение Python 3 для поиска многострочного комментария - PullRequest
3 голосов
/ 16 августа 2011

Я пытаюсь найти блоки комментариев в исходном коде PHP, используя регулярные выражения в Python 3. Комментарии PHP имеют следующий формат:

/**
 * This is a very short block comment
 */

Теперь я придумал следующее регулярное выражение:

'/\*\*[.]+?\*/'

Я полагаю, что в сочетании с флагом DOTALL это должно быть сделано, но нет. Ничего не находит. Странно то, что когда я удаляю косую черту, вот так:

'/\*\*[.]+?\*'

тогда он находит следующую строку:

/**\n\t*

Я понятия не имею, почему регулярное выражение не может найти звездочку, за которой следует косая черта ... Я проверил файл, который я ищу, чтобы дважды проверить, у меня не было опечатки в комментарии (я не сделал ). Кроме того, косая черта не является специальным символом в регулярном выражении, поэтому мне не пришлось бы избегать его. (Я пытался, но это не помогло.)

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

Кстати, я тоже сталкивался с этим ! нить, где кто-то пытался сделать то же самое в Java. Окончательный победный ответ закончил свое регулярное выражение так же, как я делаю сейчас, поэтому я ничего не понимаю :( Может ли это быть ошибка в регулярном выражении Python или я что-то упустил?

Любая помощь очень ценится! : D

Ответы [ 2 ]

4 голосов
/ 16 августа 2011

Вы можете использовать флаг re.DOTALL, чтобы символ . соответствовал символам новой строки:

re.compile(r'/\*\*.+?\*/', re.DOTALL)

(Как примечание, комментарии блока PHP могут начинаться с /*, а не только с /**.)

0 голосов
/ 16 августа 2011

Попробуйте это:

r'\/\*\*[^*]*\*+([^/][^*]*\*+)*\/'

(это регулярное выражение, используемое некоторыми CSS-парсерами для /* CSS comments */, поэтому я считаю, что оно довольно солидное)

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

/**
 * This is a very short block comment
 */

Но также:

/** This is a very short block comment */

И даже:

/** This is a very short block comment 
*/

Чтобы соответствовать точному формату докблоков, вам нужен реальный парсер, а не регулярные выражения.

...