1

如果满足某些条件,我正在尝试匹配一堆 python 脚本中的一些方法。我要查看的第一件事是import re文件中是否存在,如果存在,则查找re.sub(something). 我尝试按照此处的文档了解如何在没有其他正则表达式的情况下使用 if then,但似乎无法使其与 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)
4

1 回答 1

1

这可以通过 shell 管道和 xargs 轻松完成。这个想法是使用第一个正则表达式作为要搜索的文件的过滤器,第二个正则表达式显示出现的位置re.sub

这是三个要测试的 Python 文件。

import-without-sub.pyimport 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('. (我们使用--nulland-0来正确处理包含空格的文件名。)

它在包含上述所有三个文件的目录中的输出是:

import-with-sub.py
7:re.sub(something)
于 2019-05-10T11:23:11.120 回答