1

複数のファイルで複数の正規表現を「grep」したい。これらすべての正規表現をファイル (1 行に 1 つ) に格納し、次の方法でロードして、「スーパー正規表現」を構築します。

dic = open('regex.dic')
rex = []
for l in iter(dic):
    if not l.startswith('#'):
        rex.append('^.*%s.*$' % l.strip())
rex = '|'.join(rex)
debug('rex='+rex)
global regex
regex = re.compile(rex, re.IGNORECASE|re.MULTILINE)
dic.close()

次に、次のようにファイルをチェックします。

with open(fn, 'r') as f: data = f.readlines()
for i, line in enumerate(data):
    if len(line) <= 512: #Sanity check
        if regex.search(line):
            if not alreadyFound:
                log( "[!]Found in %s:" % fn)
                alreadyFound = True
                found = True
                copyFile(fn)
            log("\t%s" % '\t'.join(data[i-args.context:i+args.context+1]).strip())

これは機能します。これは実際には効率的で危険ではないと思います(ディックの一部の正規表現は「スーパー正規表現」を壊す可能性があります)。正規表現配列でループすることを考えていましたが、それは各ファイルを複数回スキャンすることを意味します:/

これを行う方法についての素晴らしいアイデアはありますか? ありがとう!

4

1 に答える 1

1
if l and l[0] != '#':
    try:
        re.compile(s)
    except:
        #handle any way you want
    else:
        rex.append('^.*({0}).*$'.format(l.strip()))

これにより、不正な正規表現が処理されます。

于 2013-05-07T15:25:22.827 に答える