正则表达式搜索多文件内容

来源:互联网 发布:禁止加载驱动软件 编辑:程序博客网 时间:2024/05/29 17:52
import os
import glob
import re
from optparse import OptionParser

def process_parameters():
    usage = "usage: %prog [options] search_reg_pattern"
    parser = OptionParser(usage)
    parser.add_option("-f", "--file", dest="file", default="*", help="file name to search, glob format")
    parser.add_option("-d", "--dir", dest="dir", default="./", help="dir")
    parser.add_option("-r", "--recursive", action="store_true", dest="recursive", default=False, help="recursive search directory, not support yet")
    parser.add_option("-q", "--quiet", action="store_false", dest="verbose", default=True, help="print none information during process")
    parser.add_option("-t", "--tofile", dest="tofile", default=None, help="output whole line in the file")
    parser.add_option("-m", "--mfile", dest="mfile", default=None, help="output matched partial string to the file");
    return parser;


def find_file_text(pattern, dir, file, recursive, verbose, tofile, mfile):
    if tofile:
        tofile_path = dir + os.sep + tofile
        tofile_handle = open(tofile_path, 'w')
    if mfile:
        mfile_path = dir + os.sep + mfile;
        mfile_handle = open(mfile_path, 'w')
    match_count = 0;
    glob_str = dir + os.sep + file
    if verbose:
        print "find ", pattern, "in ", glob_str
    for filename in glob.glob(glob_str):
        if not os.path.isdir(filename):
            file_obj=open(filename,'rU')
            line_no=0
            for eachline in file_obj:
                line_no=line_no+1
                matched_list = re.findall(pattern, eachline, re.M|re.I)
                if matched_list:
                    match_count = match_count + 1;
                    if tofile:
                        tofile_handle.write(eachline+'\n')
                    if mfile:
                        for matched in matched_list:
                            mfile_handle.write(matched + '\n')
                    if verbose:
                        print "[%d] %s(%d):%s"%(match_count, filename, line_no, eachline)
    if tofile:
            tofile_handle.close()
                            
 
if __name__ == "__main__":
    parser = process_parameters()
    (options, args) = parser.parse_args()
    if len(args) == 0:
        parser.error("incorrect number of arguments")
    print options, args
    find_file_text(args[0], options.dir, options.file, options.recursive, options.verbose, options.tofile, options.mfile)
    


原创粉丝点击