Как найти некомментированные команды в исходном коде с помощью регулярных выражений - PullRequest
2 голосов
/ 22 марта 2020

Мне нужно регулярное выражение, чтобы найти команду "source" и принять ее аргумент. Проблема в том, что код может быть закомментирован, в этом случае его необходимо игнорировать. Комментарии начинаются с «#».

Пример кода:

Соответствие регистров:

source run.sh
source /path/run3.sh # comment
echo "Msg"; source ./run4.changelist
other_command_1; other_command_2; ... ; other_command_n; source ./run4.changelist
    source run.changelist

Не совпадать с вариантами :

# source run.changelist
# source /path/run3.sh # comment
echo "Msg"; # source ./run4.changelist
other_command; # source ./run4.changelist
other_command # source ./run4.changelist
other_command_1; other_command_2; ... ; other_command_n # source ./run4.changelist
    # source run.changelist

Я написал одну версию, но она не охватывает все:

^(?!\s*#)(?!.*;).*source\s+((.*.sh)|(.*.changelist))

1 Ответ

1 голос
/ 22 марта 2020

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

r='"{3}.*?"{3}|#[^"\'\n]*|source ([^\n#]*)'

См. regex demo .

Пример кода:

regex = r'"{3}.*?\"{3}|#[^"\'\n]*|source ([^\n#]*)'
matches = re.findall(regex, your_text, re.MULTILINE)
print(matches)

Выход:

['run.sh', '/path/run3.sh ', '', './run4.changelist', './run4.changelist',
 'run.changelist', '', './run4.changelist', '', '', '', '', '', '', '']

Теперь вам придется действовать со всеми непустыми захватами либо фильтрованием, либо итерацией, и т. Д. c.

Редактировать: Мне, вероятно, следовало добавить пример фильтра:

filter(lambda c: c != '', matches)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...