Regex если тогда без остального в ripgrep - PullRequest
1 голос
/ 09 мая 2019

Я пытаюсь сопоставить некоторые методы в связке сценариев Python, если выполняются определенные условия. Первое, на что я смотрю, это если import re существует в файле, и если это так, то найдите все случаи re.sub(something). Я попытался следовать документации здесь о том, как использовать если затем без каких-либо регулярных выражений, но, похоже, не могу заставить его работать с ripgrep с или без pcre2.

Мой следующий подход состоял в использовании групп, поэтому rg -n "(^import.+re)|(re\.sub.+)" -r '$2', но проблема с этим подходом заключается в том, что, поскольку первая группа импорта совпадает, я получаю много пустых файлов обратно в свой вывод. $2 обрабатывается правильно.

Я надеюсь избежать захвата группы или группы и использовать регулярное выражение, если это возможно.

Подводя итог, я надеюсь, что если в любом месте файла появится import re, найдите re\.sub.+ и выведите только соответствующие файлы и строки, используя ripgrep. Использование ripgrep - сложная зависимость.

Пример кода:

import re

for i in range(10):
    re.match(something)
    print(i)

re.sub(something)

1 Ответ

1 голос
/ 10 мая 2019

Это можно сделать довольно легко с помощью конвейера оболочки и xargs.Идея состоит в том, чтобы использовать первое регулярное выражение в качестве фильтра для поиска файлов, а второе регулярное выражение для отображения мест, где встречается re.sub.

Вот три файла Python для тестирования.

import-without-sub.py имеет import re, но не re.sub:

import re

for i in range(10):
    re.match(something)
    print(i)

import-with-sub.py имеет как import re, так и re.sub:

import re

for i in range(10):
    re.match(something)
    print(i)

re.sub(something)

И, наконец, no-import.py не имеет import re, но имеет re.sub:

for i in range(10):
    re.match(something)
    print(i)

re.sub(something)

А теперь вот команда, чтобы показать только совпадения re.sub в файлах, которые содержат import re:

rg '^import\s+re$' --files-with-matches --null | xargs -0 rg -F 're.sub('

--files-with-matches и --null распечатать все подходящие пути к файлам, разделенные байтом NUL.xargs -0 затем считывает эти пути к файлам и превращает их в аргументы, которые будут переданы rg -F 're.sub('.(Мы используем --null и -0 для правильной обработки имен файлов, содержащих пробелы.)

Его выходные данные в каталоге со всеми тремя из указанных выше файлов:

import-with-sub.py
7:re.sub(something)
...