Регулярное выражение для комментариев в Python re

#python #regex #re

Вопрос:

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

 One-line comment:
#= this is a coment

some code here

#= this is a 
multiline comment =#
 

и я пытался получить одно (или несколько) регулярных выражений, чтобы иметь возможность захватить их обоих. У меня есть r'(#=)[w ]*' однострочный комментарий, но я потерпел неудачу с многострочным комментарием.

Вы можете мне в этом помочь?

Комментарии:

1. похоже, вам следует пересмотреть то, как работают ваши комментарии-их невозможно отличить друг от друга

2. Не может ли что-то подобное (#=.*n.*=#(b|n|$))|(#=.*n) сработать в обоих случаях?

Ответ №1:

В комментариях уже указывалось, что этот синтаксис не идеален. Однако вы можете проанализировать свои комментарии, используя отрицательный внешний вид:

 import re
s = """uniline comment:
#= this is a coment

some code here

#= this is a 
multiline comment =#

#=single comment at the end"""

pattern = re.compile(r'#=(?:(?!#=).)*?=#|#=.*?(?=n|$)', re.DOTALL)
result = re.findall(pattern, s)
print(result)
 
  • #=(?:(?!#=).)*?=# захватывает все между #= и следующим =# (многострочный комментарий). Мы исключаем #= , чтобы избежать захвата однострочных комментариев в нашем многострочном совпадении.
  • #=.*?(?=n|$) захватывает однострочные комментарии ( $ гарантирует, что однострочные комментарии будут записаны даже в конце файла)

Смотрите демонстрацию