#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|$)
захватывает однострочные комментарии ($
гарантирует, что однострочные комментарии будут записаны даже в конце файла)
Смотрите демонстрацию