【问题标题】:Search directory for string在目录中搜索字符串
【发布时间】:2012-10-24 03:29:31
【问题描述】:

我正在尝试在目录中搜索 Python 中的给定字符串模式。然后我想将匹配组合成一个数组。

一开始我尝试使用grep:

regex = " dojo.require(..*) "
bashCommand = "grep"+" --only-matching -r -h"+regex+baseDir
process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE)
dirStr = process.communicate()[0]

但我意识到我需要支持多行的字符串,例如

dojo.require(
"abc"(;

所以 grep 不是一个选项。

我还有什么其他方法可以做到这一点?提前致谢。

【问题讨论】:

标签: python regex


【解决方案1】:

您可以使用osre 的组合在纯Python 中实现此功能,而不是调用grep。使用re.DOTALL 标志允许多行匹配。例如:

import re, os

def grep(regex, base_dir):
    compiled_regex = re.compile(regex, re.DOTALL)
    matches = list()
    for filename in os.listdir(base_dir):
        full_filename = os.path.join(base_dir, filename)
        if not os.path.isfile(full_filename):
            continue
        with open(os.path.join(base_dir, filename)) as fh:
            content = fh.read()
            if compiled_regex.search(content):
                matches.append(full_filename)
    return matches

print grep(" dojo.require(..*) ", ".")

【讨论】:

  • 我真的很喜欢这种方法。一件事-我如何自己获取实际匹配项,而不是文件名,然后将它们放入列表中?我看到 search() 返回了一个 MatchObject...我可以只用 expand() 来获取实际的匹配吗?
  • 使用 MatchObject.group(0) 来获取整个匹配的字符串,或者使用 MatchObject.group(1) 来获取第一个匹配组(即正则表达式中第一个括号中的所有内容)。但是,我认为您的正则表达式没有正确转义,并且不会按照您的预期进行。尝试将其更改为“dojo\.require\((.*?)\)”,然后您应该能够使用 MatchObject.group(1) 访问括号中的所有内容。
【解决方案2】:

您可以使用prcegrep,请参阅this question。 为此,您需要将正则表达式调整为多行。

你也可以使用:

  • os.walk 递归访问所有文件。
  • re.search 搜索正确的表达式。

This question 有一个例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-20
    • 2012-05-22
    • 1970-01-01
    • 2014-12-19
    • 2012-09-23
    • 2017-02-11
    • 1970-01-01
    相关资源
    最近更新 更多